Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
angle
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
angle
Commits
646559fe
Commit
646559fe
authored
Aug 15, 2013
by
Geoff Lang
Committed by
Geoff Lang
Aug 27, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add support for the remaining ES3 framebuffer attachment parameter queries.
TRAC #23474 Author: Geoff Lang Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods
parent
0a804796
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
225 additions
and
85 deletions
+225
-85
Framebuffer.cpp
src/libGLESv2/Framebuffer.cpp
+5
-0
Framebuffer.h
src/libGLESv2/Framebuffer.h
+1
-0
libGLESv2.cpp
src/libGLESv2/libGLESv2.cpp
+219
-85
No files found.
src/libGLESv2/Framebuffer.cpp
View file @
646559fe
...
...
@@ -269,6 +269,11 @@ Renderbuffer *Framebuffer::getStencilbuffer() const
return
mStencilbuffer
.
get
();
}
Renderbuffer
*
Framebuffer
::
getDepthStencilBuffer
()
const
{
return
(
mDepthbuffer
.
id
()
==
mStencilbuffer
.
id
())
?
mDepthbuffer
.
get
()
:
NULL
;
}
Renderbuffer
*
Framebuffer
::
getDepthOrStencilbuffer
()
const
{
Renderbuffer
*
depthstencilbuffer
=
mDepthbuffer
.
get
();
...
...
src/libGLESv2/Framebuffer.h
View file @
646559fe
...
...
@@ -49,6 +49,7 @@ class Framebuffer
Renderbuffer
*
getColorbuffer
(
unsigned
int
colorAttachment
)
const
;
Renderbuffer
*
getDepthbuffer
()
const
;
Renderbuffer
*
getStencilbuffer
()
const
;
Renderbuffer
*
getDepthStencilBuffer
()
const
;
Renderbuffer
*
getDepthOrStencilbuffer
()
const
;
Renderbuffer
*
getReadColorbuffer
()
const
;
GLenum
getReadColorbufferType
()
const
;
...
...
src/libGLESv2/libGLESv2.cpp
View file @
646559fe
...
...
@@ -2861,85 +2861,159 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
if
(
context
)
{
if
(
target
!=
GL_FRAMEBUFFER
&&
target
!=
GL_DRAW_FRAMEBUFFER_ANGLE
&&
target
!=
GL_READ_FRAMEBUFFER_ANGLE
)
META_ASSERT
(
GL_DRAW_FRAMEBUFFER_ANGLE
==
GL_DRAW_FRAMEBUFFER
&&
GL_READ_FRAMEBUFFER_ANGLE
==
GL_READ_FRAMEBUFFER
);
if
(
target
!=
GL_FRAMEBUFFER
&&
target
!=
GL_DRAW_FRAMEBUFFER
&&
target
!=
GL_READ_FRAMEBUFFER
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
gl
::
Framebuffer
*
framebuffer
=
NULL
;
if
(
target
==
GL_READ_FRAMEBUFFER_ANGLE
)
switch
(
pname
)
{
if
(
context
->
getReadFramebufferHandle
()
==
0
)
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
:
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
:
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
:
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
:
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE
:
case
GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
:
case
GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
:
case
GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
:
case
GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
:
case
GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
:
case
GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE
:
case
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
:
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
:
if
(
context
->
getClientVersion
()
>=
3
)
{
return
gl
::
error
(
GL_INVALID_OPERATION
)
;
break
;
}
framebuffer
=
context
->
getReadFramebuffer
(
);
default
:
return
gl
::
error
(
GL_INVALID_ENUM
);
}
else
// Determine if the attachment is a valid enum
switch
(
attachment
)
{
if
(
context
->
getDrawFramebufferHandle
()
==
0
)
case
GL_BACK
:
case
GL_FRONT
:
case
GL_STENCIL
:
case
GL_DEPTH_STENCIL_ATTACHMENT
:
if
(
context
->
getClientVersion
()
<
3
)
{
return
gl
::
error
(
GL_INVALID_
OPERATION
);
return
gl
::
error
(
GL_INVALID_
ENUM
);
}
break
;
framebuffer
=
context
->
getDrawFramebuffer
();
case
GL_DEPTH_ATTACHMENT
:
case
GL_STENCIL_ATTACHMENT
:
break
;
default
:
if
(
attachment
<
GL_COLOR_ATTACHMENT0_EXT
||
(
attachment
-
GL_COLOR_ATTACHMENT0_EXT
)
>=
context
->
getMaximumRenderTargets
())
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
break
;
}
GLuint
framebufferHandle
=
(
target
==
GL_READ_FRAMEBUFFER
)
?
context
->
getReadFramebufferHandle
()
:
context
->
getDrawFramebufferHandle
();
gl
::
Framebuffer
*
framebuffer
=
context
->
getFramebuffer
(
framebufferHandle
);
GLenum
attachmentType
;
GLuint
attachmentHandle
;
GLuint
attachmentLevel
;
GLuint
attachmentLayer
;
gl
::
Renderbuffer
*
renderbuffer
;
if
(
attachment
>=
GL_COLOR_ATTACHMENT0_EXT
&&
attachment
<=
GL_COLOR_ATTACHMENT15_EXT
)
if
(
framebufferHandle
==
0
)
{
const
unsigned
int
colorAttachment
=
(
attachment
-
GL_COLOR_ATTACHMENT0_EXT
);
if
(
colorAttachment
>=
context
->
getMaximumRenderTargets
())
if
(
context
->
getClientVersion
()
<
3
)
{
return
gl
::
error
(
GL_INVALID_
ENUM
);
return
gl
::
error
(
GL_INVALID_
OPERATION
);
}
attachmentType
=
framebuffer
->
getColorbufferType
(
colorAttachment
);
attachmentHandle
=
framebuffer
->
getColorbufferHandle
(
colorAttachment
);
attachmentLevel
=
framebuffer
->
getColorbufferMipLevel
(
colorAttachment
);
attachmentLayer
=
framebuffer
->
getColorbufferLayer
(
colorAttachment
);
}
else
{
switch
(
attachment
)
{
case
GL_DEPTH_ATTACHMENT
:
case
GL_BACK
:
attachmentType
=
framebuffer
->
getColorbufferType
(
0
);
attachmentHandle
=
framebuffer
->
getColorbufferHandle
(
0
);
attachmentLevel
=
framebuffer
->
getColorbufferMipLevel
(
0
);
attachmentLayer
=
framebuffer
->
getColorbufferLayer
(
0
);
renderbuffer
=
framebuffer
->
getColorbuffer
(
0
);
break
;
case
GL_DEPTH
:
attachmentType
=
framebuffer
->
getDepthbufferType
();
attachmentHandle
=
framebuffer
->
getDepthbufferHandle
();
attachmentLevel
=
framebuffer
->
getDepthbufferMipLevel
();
attachmentLayer
=
framebuffer
->
getDepthbufferLayer
();
renderbuffer
=
framebuffer
->
getDepthbuffer
();
break
;
case
GL_STENCIL
_ATTACHMENT
:
case
GL_STENCIL
:
attachmentType
=
framebuffer
->
getStencilbufferType
();
attachmentHandle
=
framebuffer
->
getStencilbufferHandle
();
attachmentLevel
=
framebuffer
->
getStencilbufferMipLevel
();
attachmentLayer
=
framebuffer
->
getStencilbufferLayer
();
renderbuffer
=
framebuffer
->
getStencilbuffer
();
break
;
case
GL_DEPTH_STENCIL_ATTACHMENT
:
if
(
context
->
getClientVersion
()
<
3
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
if
(
framebuffer
->
getDepthbufferHandle
()
!=
framebuffer
->
getStencilbufferHandle
())
default
:
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
}
else
{
if
(
attachment
>=
GL_COLOR_ATTACHMENT0_EXT
&&
attachment
<=
GL_COLOR_ATTACHMENT15_EXT
)
{
const
unsigned
int
colorAttachment
=
(
attachment
-
GL_COLOR_ATTACHMENT0_EXT
);
attachmentType
=
framebuffer
->
getColorbufferType
(
colorAttachment
);
attachmentHandle
=
framebuffer
->
getColorbufferHandle
(
colorAttachment
);
attachmentLevel
=
framebuffer
->
getColorbufferMipLevel
(
colorAttachment
);
attachmentLayer
=
framebuffer
->
getColorbufferLayer
(
colorAttachment
);
renderbuffer
=
framebuffer
->
getColorbuffer
(
colorAttachment
);
}
else
{
switch
(
attachment
)
{
case
GL_DEPTH_ATTACHMENT
:
attachmentType
=
framebuffer
->
getDepthbufferType
();
attachmentHandle
=
framebuffer
->
getDepthbufferHandle
();
attachmentLevel
=
framebuffer
->
getDepthbufferMipLevel
();
attachmentLayer
=
framebuffer
->
getDepthbufferLayer
();
renderbuffer
=
framebuffer
->
getDepthbuffer
();
break
;
case
GL_STENCIL_ATTACHMENT
:
attachmentType
=
framebuffer
->
getStencilbufferType
();
attachmentHandle
=
framebuffer
->
getStencilbufferHandle
();
attachmentLevel
=
framebuffer
->
getStencilbufferMipLevel
();
attachmentLayer
=
framebuffer
->
getStencilbufferLayer
();
renderbuffer
=
framebuffer
->
getStencilbuffer
();
break
;
case
GL_DEPTH_STENCIL_ATTACHMENT
:
if
(
framebuffer
->
getDepthbufferHandle
()
!=
framebuffer
->
getStencilbufferHandle
())
{
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
attachmentType
=
framebuffer
->
getDepthStencilbufferType
();
attachmentHandle
=
framebuffer
->
getDepthStencilbufferHandle
();
attachmentLevel
=
framebuffer
->
getDepthStencilbufferMipLevel
();
attachmentLayer
=
framebuffer
->
getDepthStencilbufferLayer
();
renderbuffer
=
framebuffer
->
getDepthStencilBuffer
();
break
;
default
:
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
attachmentType
=
framebuffer
->
getDepthStencilbufferType
();
attachmentHandle
=
framebuffer
->
getDepthStencilbufferHandle
();
attachmentLevel
=
framebuffer
->
getDepthStencilbufferMipLevel
();
attachmentLayer
=
framebuffer
->
getDepthStencilbufferLayer
();
default
:
return
gl
::
error
(
GL_INVALID_ENUM
);
}
}
GLenum
attachmentObjectType
;
// Type category
if
(
attachmentType
==
GL_NONE
||
attachmentType
==
GL_RENDERBUFFER
)
if
(
framebufferHandle
==
0
)
{
attachmentObjectType
=
GL_FRAMEBUFFER_DEFAULT
;
}
else
if
(
attachmentType
==
GL_NONE
||
attachmentType
==
GL_RENDERBUFFER
)
{
attachmentObjectType
=
attachmentType
;
}
...
...
@@ -2953,64 +3027,124 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
return
;
}
switch
(
pname
)
if
(
attachmentObjectType
==
GL_NONE
)
{
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
:
*
params
=
attachmentObjectType
;
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
:
if
(
attachmentObjectType
==
GL_RENDERBUFFER
||
attachmentObjectType
==
GL_TEXTURE
)
{
*
params
=
attachmentHandle
;
}
else
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
:
if
(
attachmentObjectType
==
GL_TEXTURE
)
{
*
params
=
attachmentLevel
;
}
else
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
:
if
(
attachmentObjectType
==
GL_TEXTURE
)
// ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
// is NONE, then querying any other pname will generate INVALID_ENUM.
// ES 3.0.2 spec pg 235 states that if the attachment type is none,
// GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
// INVALID_OPERATION for all other pnames
switch
(
pname
)
{
if
(
gl
::
IsCubemapTextureTarget
(
attachmentType
))
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
:
*
params
=
attachmentObjectType
;
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
:
if
(
context
->
getClientVersion
()
<
3
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
*
params
=
0
;
break
;
default
:
if
(
context
->
getClientVersion
()
<
3
)
{
*
params
=
attachmentType
;
return
gl
::
error
(
GL_INVALID_ENUM
)
;
}
else
{
*
params
=
0
;
gl
::
error
(
GL_INVALID_OPERATION
)
;
}
}
else
}
else
{
ASSERT
(
attachmentObjectType
==
GL_RENDERBUFFER
||
attachmentObjectType
==
GL_TEXTURE
||
attachmentObjectType
==
GL_FRAMEBUFFER_DEFAULT
);
ASSERT
(
renderbuffer
!=
NULL
);
switch
(
pname
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
:
*
params
=
attachmentObjectType
;
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
:
if
(
attachmentObjectType
!=
GL_RENDERBUFFER
&&
attachmentObjectType
!=
GL_TEXTURE
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
*
params
=
attachmentHandle
;
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
:
if
(
attachmentObjectType
!=
GL_TEXTURE
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
*
params
=
attachmentLevel
;
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
:
if
(
attachmentObjectType
!=
GL_TEXTURE
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
*
params
=
gl
::
IsCubemapTextureTarget
(
attachmentType
)
?
attachmentType
:
0
;
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE
:
*
params
=
renderbuffer
->
getRedSize
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
:
*
params
=
renderbuffer
->
getGreenSize
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
:
*
params
=
renderbuffer
->
getBlueSize
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
:
*
params
=
renderbuffer
->
getAlphaSize
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
:
*
params
=
renderbuffer
->
getDepthSize
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
:
*
params
=
renderbuffer
->
getStencilSize
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE
:
if
(
attachment
==
GL_DEPTH_STENCIL
)
{
gl
::
error
(
GL_INVALID_OPERATION
);
}
*
params
=
renderbuffer
->
getComponentType
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
:
*
params
=
renderbuffer
->
getColorEncoding
();
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
:
if
(
attachmentObjectType
!=
GL_TEXTURE
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
*
params
=
attachmentLayer
;
break
;
default
:
UNREACHABLE
();
break
;
}
break
;
case
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
:
if
(
context
->
getClientVersion
()
<
3
)
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
if
(
attachmentObjectType
==
GL_TEXTURE
)
{
*
params
=
attachmentLayer
;
}
else
{
return
gl
::
error
(
GL_INVALID_ENUM
);
}
break
;
default
:
return
gl
::
error
(
GL_INVALID_ENUM
);
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment