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
42359ca9
Commit
42359ca9
authored
Aug 21, 2013
by
Geoff Lang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implemented glClearBuffer*
TRAC #23475 Author: Geoff Lang Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods
parent
0b83323d
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
274 additions
and
39 deletions
+274
-39
Context.cpp
src/libGLESv2/Context.cpp
+205
-30
Context.h
src/libGLESv2/Context.h
+6
-1
libGLESv2.cpp
src/libGLESv2/libGLESv2.cpp
+63
-8
No files found.
src/libGLESv2/Context.cpp
View file @
42359ca9
...
@@ -2425,37 +2425,7 @@ bool Context::applyUniformBuffers()
...
@@ -2425,37 +2425,7 @@ bool Context::applyUniformBuffers()
return
programBinary
->
applyUniformBuffers
(
boundBuffers
);
return
programBinary
->
applyUniformBuffers
(
boundBuffers
);
}
}
void
Context
::
readPixels
(
GLint
x
,
GLint
y
,
GLsizei
width
,
GLsizei
height
,
GLenum
format
,
GLenum
type
,
GLsizei
*
bufSize
,
void
*
pixels
)
{
Framebuffer
*
framebuffer
=
getReadFramebuffer
();
if
(
framebuffer
->
completeness
()
!=
GL_FRAMEBUFFER_COMPLETE
)
{
return
gl
::
error
(
GL_INVALID_FRAMEBUFFER_OPERATION
);
}
if
(
getReadFramebufferHandle
()
!=
0
&&
framebuffer
->
getSamples
()
!=
0
)
{
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
GLint
sizedInternalFormat
=
IsSizedInternalFormat
(
format
,
mClientVersion
)
?
format
:
GetSizedInternalFormat
(
format
,
type
,
mClientVersion
);
GLsizei
outputPitch
=
GetRowPitch
(
sizedInternalFormat
,
type
,
mClientVersion
,
width
,
getPackAlignment
());
// sized query sanity check
if
(
bufSize
)
{
int
requiredSize
=
outputPitch
*
height
;
if
(
requiredSize
>
*
bufSize
)
{
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
}
mRenderer
->
readPixels
(
framebuffer
,
x
,
y
,
width
,
height
,
format
,
type
,
outputPitch
,
getPackReverseRowOrder
(),
getPackAlignment
(),
pixels
);
}
void
Context
::
clear
(
GLbitfield
mask
)
void
Context
::
clear
(
GLbitfield
mask
)
{
{
...
@@ -2525,6 +2495,211 @@ void Context::clear(GLbitfield mask)
...
@@ -2525,6 +2495,211 @@ void Context::clear(GLbitfield mask)
mRenderer
->
clear
(
clearParams
,
framebufferObject
);
mRenderer
->
clear
(
clearParams
,
framebufferObject
);
}
}
void
Context
::
clearBufferfv
(
GLenum
buffer
,
int
drawbuffer
,
const
float
*
values
)
{
// glClearBufferfv can be called to clear the color buffer or depth buffer
ClearParameters
clearParams
=
{
0
};
if
(
buffer
==
GL_COLOR
)
{
for
(
unsigned
int
i
=
0
;
i
<
ArraySize
(
clearParams
.
clearColor
);
i
++
)
{
clearParams
.
clearColor
[
i
]
=
(
drawbuffer
==
static_cast
<
int
>
(
i
));
}
clearParams
.
colorFClearValue
=
ColorF
(
values
[
0
],
values
[
1
],
values
[
2
],
values
[
3
]);
clearParams
.
colorClearType
=
GL_FLOAT
;
}
else
{
for
(
unsigned
int
i
=
0
;
i
<
ArraySize
(
clearParams
.
clearColor
);
i
++
)
{
clearParams
.
clearColor
[
i
]
=
false
;
}
clearParams
.
colorFClearValue
=
mState
.
colorClearValue
;
clearParams
.
colorClearType
=
GL_FLOAT
;
}
clearParams
.
colorMaskRed
=
mState
.
blend
.
colorMaskRed
;
clearParams
.
colorMaskGreen
=
mState
.
blend
.
colorMaskGreen
;
clearParams
.
colorMaskBlue
=
mState
.
blend
.
colorMaskBlue
;
clearParams
.
colorMaskAlpha
=
mState
.
blend
.
colorMaskAlpha
;
if
(
buffer
==
GL_DEPTH
)
{
clearParams
.
clearDepth
=
true
;
clearParams
.
depthClearValue
=
values
[
0
];
}
else
{
clearParams
.
clearDepth
=
false
;
clearParams
.
depthClearValue
=
mState
.
depthClearValue
;
}
clearParams
.
clearStencil
=
false
;
clearParams
.
stencilClearValue
=
mState
.
stencilClearValue
;
clearParams
.
stencilWriteMask
=
mState
.
depthStencil
.
stencilWritemask
;
clearParams
.
scissorEnabled
=
mState
.
scissorTest
;
clearParams
.
scissor
=
mState
.
scissor
;
if
(
!
applyRenderTarget
(
GL_TRIANGLES
,
true
))
// Clips the clear to the scissor rectangle but not the viewport
{
return
;
}
mRenderer
->
clear
(
clearParams
,
getDrawFramebuffer
());
}
void
Context
::
clearBufferuiv
(
GLenum
buffer
,
int
drawbuffer
,
const
unsigned
int
*
values
)
{
// glClearBufferuv can only be called to clear a color buffer
ClearParameters
clearParams
=
{
0
};
for
(
unsigned
int
i
=
0
;
i
<
ArraySize
(
clearParams
.
clearColor
);
i
++
)
{
clearParams
.
clearColor
[
i
]
=
(
drawbuffer
==
static_cast
<
int
>
(
i
));
}
clearParams
.
colorUIClearValue
=
ColorUI
(
values
[
0
],
values
[
1
],
values
[
2
],
values
[
3
]);
clearParams
.
colorClearType
=
GL_UNSIGNED_INT
;
clearParams
.
colorMaskRed
=
mState
.
blend
.
colorMaskRed
;
clearParams
.
colorMaskGreen
=
mState
.
blend
.
colorMaskGreen
;
clearParams
.
colorMaskBlue
=
mState
.
blend
.
colorMaskBlue
;
clearParams
.
colorMaskAlpha
=
mState
.
blend
.
colorMaskAlpha
;
clearParams
.
clearDepth
=
false
;
clearParams
.
depthClearValue
=
mState
.
depthClearValue
;
clearParams
.
clearStencil
=
false
;
clearParams
.
stencilClearValue
=
mState
.
stencilClearValue
;
clearParams
.
stencilWriteMask
=
mState
.
depthStencil
.
stencilWritemask
;
clearParams
.
scissorEnabled
=
mState
.
scissorTest
;
clearParams
.
scissor
=
mState
.
scissor
;
if
(
!
applyRenderTarget
(
GL_TRIANGLES
,
true
))
// Clips the clear to the scissor rectangle but not the viewport
{
return
;
}
mRenderer
->
clear
(
clearParams
,
getDrawFramebuffer
());
}
void
Context
::
clearBufferiv
(
GLenum
buffer
,
int
drawbuffer
,
const
int
*
values
)
{
// glClearBufferfv can be called to clear the color buffer or stencil buffer
ClearParameters
clearParams
=
{
0
};
if
(
buffer
==
GL_COLOR
)
{
for
(
unsigned
int
i
=
0
;
i
<
ArraySize
(
clearParams
.
clearColor
);
i
++
)
{
clearParams
.
clearColor
[
i
]
=
(
drawbuffer
==
static_cast
<
int
>
(
i
));
}
clearParams
.
colorIClearValue
=
ColorI
(
values
[
0
],
values
[
1
],
values
[
2
],
values
[
3
]);
clearParams
.
colorClearType
=
GL_INT
;
}
else
{
for
(
unsigned
int
i
=
0
;
i
<
ArraySize
(
clearParams
.
clearColor
);
i
++
)
{
clearParams
.
clearColor
[
i
]
=
false
;
}
clearParams
.
colorFClearValue
=
mState
.
colorClearValue
;
clearParams
.
colorClearType
=
GL_FLOAT
;
}
clearParams
.
colorMaskRed
=
mState
.
blend
.
colorMaskRed
;
clearParams
.
colorMaskGreen
=
mState
.
blend
.
colorMaskGreen
;
clearParams
.
colorMaskBlue
=
mState
.
blend
.
colorMaskBlue
;
clearParams
.
colorMaskAlpha
=
mState
.
blend
.
colorMaskAlpha
;
clearParams
.
clearDepth
=
false
;
clearParams
.
depthClearValue
=
mState
.
depthClearValue
;
if
(
buffer
==
GL_STENCIL
)
{
clearParams
.
clearStencil
=
true
;
clearParams
.
stencilClearValue
=
values
[
1
];
}
else
{
clearParams
.
clearStencil
=
false
;
clearParams
.
stencilClearValue
=
mState
.
stencilClearValue
;
}
clearParams
.
stencilWriteMask
=
mState
.
depthStencil
.
stencilWritemask
;
clearParams
.
scissorEnabled
=
mState
.
scissorTest
;
clearParams
.
scissor
=
mState
.
scissor
;
if
(
!
applyRenderTarget
(
GL_TRIANGLES
,
true
))
// Clips the clear to the scissor rectangle but not the viewport
{
return
;
}
mRenderer
->
clear
(
clearParams
,
getDrawFramebuffer
());
}
void
Context
::
clearBufferfi
(
GLenum
buffer
,
int
drawbuffer
,
float
depth
,
int
stencil
)
{
// glClearBufferfi can only be called to clear a depth stencil buffer
ClearParameters
clearParams
=
{
0
};
for
(
unsigned
int
i
=
0
;
i
<
ArraySize
(
clearParams
.
clearColor
);
i
++
)
{
clearParams
.
clearColor
[
i
]
=
false
;
}
clearParams
.
colorFClearValue
=
mState
.
colorClearValue
;
clearParams
.
colorClearType
=
GL_FLOAT
;
clearParams
.
colorMaskRed
=
mState
.
blend
.
colorMaskRed
;
clearParams
.
colorMaskGreen
=
mState
.
blend
.
colorMaskGreen
;
clearParams
.
colorMaskBlue
=
mState
.
blend
.
colorMaskBlue
;
clearParams
.
colorMaskAlpha
=
mState
.
blend
.
colorMaskAlpha
;
clearParams
.
clearDepth
=
true
;
clearParams
.
depthClearValue
=
depth
;
clearParams
.
clearStencil
=
true
;
clearParams
.
stencilClearValue
=
stencil
;
clearParams
.
stencilWriteMask
=
mState
.
depthStencil
.
stencilWritemask
;
clearParams
.
scissorEnabled
=
mState
.
scissorTest
;
clearParams
.
scissor
=
mState
.
scissor
;
if
(
!
applyRenderTarget
(
GL_TRIANGLES
,
true
))
// Clips the clear to the scissor rectangle but not the viewport
{
return
;
}
mRenderer
->
clear
(
clearParams
,
getDrawFramebuffer
());
}
void
Context
::
readPixels
(
GLint
x
,
GLint
y
,
GLsizei
width
,
GLsizei
height
,
GLenum
format
,
GLenum
type
,
GLsizei
*
bufSize
,
void
*
pixels
)
{
Framebuffer
*
framebuffer
=
getReadFramebuffer
();
if
(
framebuffer
->
completeness
()
!=
GL_FRAMEBUFFER_COMPLETE
)
{
return
gl
::
error
(
GL_INVALID_FRAMEBUFFER_OPERATION
);
}
if
(
getReadFramebufferHandle
()
!=
0
&&
framebuffer
->
getSamples
()
!=
0
)
{
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
GLint
sizedInternalFormat
=
IsSizedInternalFormat
(
format
,
mClientVersion
)
?
format
:
GetSizedInternalFormat
(
format
,
type
,
mClientVersion
);
GLsizei
outputPitch
=
GetRowPitch
(
sizedInternalFormat
,
type
,
mClientVersion
,
width
,
getPackAlignment
());
// sized query sanity check
if
(
bufSize
)
{
int
requiredSize
=
outputPitch
*
height
;
if
(
requiredSize
>
*
bufSize
)
{
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
}
mRenderer
->
readPixels
(
framebuffer
,
x
,
y
,
width
,
height
,
format
,
type
,
outputPitch
,
getPackReverseRowOrder
(),
getPackAlignment
(),
pixels
);
}
void
Context
::
drawArrays
(
GLenum
mode
,
GLint
first
,
GLsizei
count
,
GLsizei
instances
)
void
Context
::
drawArrays
(
GLenum
mode
,
GLint
first
,
GLsizei
count
,
GLsizei
instances
)
{
{
if
(
!
mState
.
currentProgram
)
if
(
!
mState
.
currentProgram
)
...
...
src/libGLESv2/Context.h
View file @
42359ca9
...
@@ -363,8 +363,13 @@ class Context
...
@@ -363,8 +363,13 @@ class Context
bool
getQueryParameterInfo
(
GLenum
pname
,
GLenum
*
type
,
unsigned
int
*
numParams
);
bool
getQueryParameterInfo
(
GLenum
pname
,
GLenum
*
type
,
unsigned
int
*
numParams
);
bool
getIndexedQueryParameterInfo
(
GLenum
target
,
GLenum
*
type
,
unsigned
int
*
numParams
);
bool
getIndexedQueryParameterInfo
(
GLenum
target
,
GLenum
*
type
,
unsigned
int
*
numParams
);
void
readPixels
(
GLint
x
,
GLint
y
,
GLsizei
width
,
GLsizei
height
,
GLenum
format
,
GLenum
type
,
GLsizei
*
bufSize
,
void
*
pixels
);
void
clear
(
GLbitfield
mask
);
void
clear
(
GLbitfield
mask
);
void
clearBufferfv
(
GLenum
buffer
,
int
drawbuffer
,
const
float
*
values
);
void
clearBufferuiv
(
GLenum
buffer
,
int
drawbuffer
,
const
unsigned
int
*
values
);
void
clearBufferiv
(
GLenum
buffer
,
int
drawbuffer
,
const
int
*
values
);
void
clearBufferfi
(
GLenum
buffer
,
int
drawbuffer
,
float
depth
,
int
stencil
);
void
readPixels
(
GLint
x
,
GLint
y
,
GLsizei
width
,
GLsizei
height
,
GLenum
format
,
GLenum
type
,
GLsizei
*
bufSize
,
void
*
pixels
);
void
drawArrays
(
GLenum
mode
,
GLint
first
,
GLsizei
count
,
GLsizei
instances
);
void
drawArrays
(
GLenum
mode
,
GLint
first
,
GLsizei
count
,
GLsizei
instances
);
void
drawElements
(
GLenum
mode
,
GLsizei
count
,
GLenum
type
,
const
GLvoid
*
indices
,
GLsizei
instances
);
void
drawElements
(
GLenum
mode
,
GLsizei
count
,
GLenum
type
,
const
GLvoid
*
indices
,
GLsizei
instances
);
void
sync
(
bool
block
);
// flush/finish
void
sync
(
bool
block
);
// flush/finish
...
...
src/libGLESv2/libGLESv2.cpp
View file @
42359ca9
...
@@ -8374,8 +8374,24 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val
...
@@ -8374,8 +8374,24 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val
return
gl
::
error
(
GL_INVALID_OPERATION
);
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
}
// glClearBufferiv
switch
(
buffer
)
UNIMPLEMENTED
();
{
case
GL_COLOR
:
if
(
drawbuffer
<
0
||
drawbuffer
>=
static_cast
<
GLint
>
(
context
->
getMaximumRenderTargets
()))
{
return
gl
::
error
(
GL_INVALID_VALUE
);
}
break
;
case
GL_STENCIL
:
if
(
drawbuffer
!=
0
)
{
return
gl
::
error
(
GL_INVALID_VALUE
);
}
default
:
return
gl
::
error
(
GL_INVALID_ENUM
);
}
context
->
clearBufferiv
(
buffer
,
drawbuffer
,
value
);
}
}
}
}
catch
(
std
::
bad_alloc
&
)
catch
(
std
::
bad_alloc
&
)
...
@@ -8400,8 +8416,19 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v
...
@@ -8400,8 +8416,19 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v
return
gl
::
error
(
GL_INVALID_OPERATION
);
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
}
// glClearBufferuiv
switch
(
buffer
)
UNIMPLEMENTED
();
{
case
GL_COLOR
:
if
(
drawbuffer
<
0
||
drawbuffer
>=
static_cast
<
GLint
>
(
context
->
getMaximumRenderTargets
()))
{
return
gl
::
error
(
GL_INVALID_VALUE
);
}
break
;
default
:
return
gl
::
error
(
GL_INVALID_ENUM
);
}
context
->
clearBufferuiv
(
buffer
,
drawbuffer
,
value
);
}
}
}
}
catch
(
std
::
bad_alloc
&
)
catch
(
std
::
bad_alloc
&
)
...
@@ -8426,8 +8453,25 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v
...
@@ -8426,8 +8453,25 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v
return
gl
::
error
(
GL_INVALID_OPERATION
);
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
}
// glClearBufferfv
switch
(
buffer
)
UNIMPLEMENTED
();
{
case
GL_COLOR
:
if
(
drawbuffer
<
0
||
drawbuffer
>=
static_cast
<
GLint
>
(
context
->
getMaximumRenderTargets
()))
{
return
gl
::
error
(
GL_INVALID_VALUE
);
}
break
;
case
GL_DEPTH
:
if
(
drawbuffer
!=
0
)
{
return
gl
::
error
(
GL_INVALID_VALUE
);
}
break
;
default
:
return
gl
::
error
(
GL_INVALID_ENUM
);
}
context
->
clearBufferfv
(
buffer
,
drawbuffer
,
value
);
}
}
}
}
catch
(
std
::
bad_alloc
&
)
catch
(
std
::
bad_alloc
&
)
...
@@ -8452,8 +8496,19 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G
...
@@ -8452,8 +8496,19 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G
return
gl
::
error
(
GL_INVALID_OPERATION
);
return
gl
::
error
(
GL_INVALID_OPERATION
);
}
}
// glClearBufferfi
switch
(
buffer
)
UNIMPLEMENTED
();
{
case
GL_DEPTH_STENCIL
:
if
(
drawbuffer
!=
0
)
{
return
gl
::
error
(
GL_INVALID_VALUE
);
}
break
;
default
:
return
gl
::
error
(
GL_INVALID_ENUM
);
}
context
->
clearBufferfi
(
buffer
,
drawbuffer
,
depth
,
stencil
);
}
}
}
}
catch
(
std
::
bad_alloc
&
)
catch
(
std
::
bad_alloc
&
)
...
...
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