Implement glClearBufferSubData

This commit is contained in:
baldurk
2014-11-08 13:01:01 +00:00
parent 06b8b76973
commit 5b3a8aabdb
6 changed files with 97 additions and 1 deletions
+1
View File
@@ -152,6 +152,7 @@ enum GLChunkType
CLEARBUFFERUI,
CLEARBUFFERFI,
CLEARBUFFERDATA,
CLEARBUFFERSUBDATA,
POLYGON_MODE,
POLYGON_OFFSET,
CULL_FACE,
+4
View File
@@ -105,6 +105,7 @@ const char *GLChunkNames[] =
"glClearBufferuiv",
"glClearBufferfi",
"glClearBufferData",
"glClearBufferSubData",
"glPolygonMode",
"glPolygonOffset",
"glCullFace",
@@ -1594,6 +1595,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context)
case CLEARBUFFERDATA:
Serialise_glClearBufferData(eGL_NONE, eGL_NONE, eGL_NONE, eGL_NONE, NULL);
break;
case CLEARBUFFERSUBDATA:
Serialise_glClearBufferSubData(eGL_NONE, eGL_NONE, 0, 0, eGL_NONE, eGL_NONE, NULL);
break;
case POLYGON_MODE:
Serialise_glPolygonMode(eGL_NONE, eGL_NONE);
break;
+2 -1
View File
@@ -503,7 +503,8 @@ class WrappedOpenGL
IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value));
IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil));
IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data));
IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data));
enum AttribType
{
Attrib_GLdouble = 0x01,
+1
View File
@@ -416,6 +416,7 @@ struct GLHookSet
PFNGLCLEARBUFFERUIVPROC glClearBufferuiv;
PFNGLCLEARBUFFERFIPROC glClearBufferfi;
PFNGLCLEARBUFFERDATAPROC glClearBufferData;
PFNGLCLEARBUFFERSUBDATAPROC glClearBufferSubData;
PFNGLSCISSORARRAYVPROC glScissorArrayv;
PFNGLSCISSORINDEXEDPROC glScissorIndexed;
PFNGLSCISSORINDEXEDVPROC glScissorIndexedv;
+2
View File
@@ -435,6 +435,7 @@
HookExtension(PFNGLCLEARBUFFERUIVPROC, glClearBufferuiv); \
HookExtension(PFNGLCLEARBUFFERFIPROC, glClearBufferfi); \
HookExtension(PFNGLCLEARBUFFERDATAPROC, glClearBufferData); \
HookExtension(PFNGLCLEARBUFFERSUBDATAPROC, glClearBufferSubData); \
HookExtension(PFNGLSCISSORARRAYVPROC, glScissorArrayv); \
HookExtension(PFNGLSCISSORINDEXEDPROC, glScissorIndexed); \
HookExtension(PFNGLSCISSORINDEXEDVPROC, glScissorIndexedv); \
@@ -1037,6 +1038,7 @@
HookWrapper3(void, glClearBufferuiv, GLenum, buffer, GLint, drawbuffer, const GLuint *, value); \
HookWrapper4(void, glClearBufferfi, GLenum, buffer, GLint, drawbuffer, GLfloat, depth, GLint, stencil); \
HookWrapper5(void, glClearBufferData, GLenum, target, GLenum, internalformat, GLenum, format, GLenum, type, const void *, data); \
HookWrapper7(void, glClearBufferSubData, GLenum, target, GLenum, internalformat, GLintptr, offset, GLsizeiptr, size, GLenum, format, GLenum, type, const void *, data); \
HookWrapper3(void, glScissorArrayv, GLuint, first, GLsizei, count, const GLint *, v); \
HookWrapper5(void, glScissorIndexed, GLuint, index, GLint, left, GLint, bottom, GLsizei, width, GLsizei, height); \
HookWrapper2(void, glScissorIndexedv, GLuint, index, const GLint *, v); \
@@ -1015,6 +1015,93 @@ void WrappedOpenGL::glClearBufferData(GLenum target, GLenum internalformat, GLen
}
}
bool WrappedOpenGL::Serialise_glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
{
SERIALISE_ELEMENT(GLenum, Target, target);
SERIALISE_ELEMENT(GLenum, InternalFormat, internalformat);
SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)offset);
SERIALISE_ELEMENT(uint64_t, Size, (uint64_t)size);
SERIALISE_ELEMENT(GLenum, Format, format);
SERIALISE_ELEMENT(GLenum, Type, type);
uint64_t val[4] = {0};
if(m_State >= WRITING)
{
size_t s = 1;
switch(Format)
{
default:
RDCWARN("Unexpected format %x, defaulting to single component", Format);
case eGL_RED:
case eGL_DEPTH_COMPONENT:
s = 1; break;
case eGL_RG:
case eGL_DEPTH_STENCIL:
s = 2; break;
case eGL_RGB:
case eGL_BGR:
s = 3; break;
case eGL_RGBA:
case eGL_BGRA:
s = 4; break;
}
switch(Type)
{
case eGL_UNSIGNED_BYTE:
case eGL_BYTE:
s *= 1; break;
case eGL_UNSIGNED_SHORT:
case eGL_SHORT:
s *= 2; break;
case eGL_UNSIGNED_INT:
case eGL_INT:
case eGL_FLOAT:
s *= 4; break;
default:
RDCWARN("Unexpected type %x, defaulting to 1 byte single component type", Format);
case eGL_UNSIGNED_BYTE_3_3_2:
case eGL_UNSIGNED_BYTE_2_3_3_REV:
s = 1; break;
case eGL_UNSIGNED_SHORT_5_6_5:
case eGL_UNSIGNED_SHORT_5_6_5_REV:
case eGL_UNSIGNED_SHORT_4_4_4_4:
case eGL_UNSIGNED_SHORT_4_4_4_4_REV:
case eGL_UNSIGNED_SHORT_5_5_5_1:
case eGL_UNSIGNED_SHORT_1_5_5_5_REV:
case eGL_UNSIGNED_INT_8_8_8_8:
case eGL_UNSIGNED_INT_8_8_8_8_REV:
s = 2; break;
case eGL_UNSIGNED_INT_10_10_10_2:
case eGL_UNSIGNED_INT_2_10_10_10_REV:
s = 4; break;
}
memcpy(val, data, s);
}
m_pSerialiser->Serialise<4>("data", val);
if(m_State <= EXECUTING)
{
m_Real.glClearBufferSubData(Target, InternalFormat, (GLintptr)Offset, (GLsizeiptr)Size, Format, Type, (const void *)&val[0]);
}
return true;
}
void WrappedOpenGL::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
{
m_Real.glClearBufferSubData(target, internalformat, offset, size, format, type, data);
if(m_State == WRITING_CAPFRAME)
{
SCOPED_SERIALISE_CONTEXT(CLEARBUFFERSUBDATA);
Serialise_glClearBufferSubData(target, internalformat, offset, size, format, type, data);
m_ContextRecord->AddChunk(scope.Get());
}
}
bool WrappedOpenGL::Serialise_glClear(GLbitfield mask)
{
SERIALISE_ELEMENT(uint32_t, Mask, mask);