Store index format and topology in drawcall, to accommodate GL

* D3D11 just latches the state from the input assembler state into the
  drawcall when it's being added. GL stores the state per-draw.
This commit is contained in:
baldurk
2015-01-15 17:17:12 +00:00
parent b9f1b9820f
commit f013f6fd29
19 changed files with 190 additions and 262 deletions
+1 -4
View File
@@ -30,7 +30,7 @@ struct D3D11PipelineState
struct InputAssembler
{
InputAssembler() : Bytecode(NULL), Topology(eTopology_Unknown) {}
InputAssembler() : Bytecode(NULL) {}
struct LayoutInput
{
@@ -60,11 +60,8 @@ struct D3D11PipelineState
{
IndexBuffer() : Buffer(), Offset(0) {}
ResourceId Buffer;
ResourceFormat Format;
uint32_t Offset;
} ibuffer;
PrimitiveTopology Topology;
} m_IA;
struct ShaderStage
+5
View File
@@ -166,6 +166,8 @@ struct FetchDrawcall
indexOffset = 0;
vertexOffset = 0;
instanceOffset = 0;
topology = eTopology_Unknown;
indexByteWidth = 0;
flags = 0;
context = ResourceId();
duration = -1.0f;
@@ -187,6 +189,9 @@ struct FetchDrawcall
uint32_t indexOffset;
uint32_t vertexOffset;
uint32_t instanceOffset;
uint32_t indexByteWidth;
PrimitiveTopology topology;
ResourceId context;
+2 -10
View File
@@ -30,7 +30,7 @@ struct GLPipelineState
struct VertexInput
{
VertexInput() : Topology(eTopology_Unknown) {}
VertexInput() {}
struct VertexAttribute
{
@@ -53,15 +53,7 @@ struct GLPipelineState
};
rdctype::array<VertexBuffer> vbuffers;
struct IndexBuffer
{
IndexBuffer() : Buffer(), Offset(0) {}
ResourceId Buffer;
ResourceFormat Format;
uint32_t Offset;
} ibuffer;
PrimitiveTopology Topology;
ResourceId ibuffer;
} m_VtxIn;
struct ShaderStage
+3 -11
View File
@@ -107,10 +107,8 @@ void Serialiser::Serialise(const char *name, D3D11PipelineState::InputAssembler:
template<>
void Serialiser::Serialise(const char *name, D3D11PipelineState::InputAssembler &el)
{
Serialise("", el.Topology);
Serialise("", el.ibuffer.Buffer);
Serialise("", el.ibuffer.Offset);
Serialise("", el.ibuffer.Format);
Serialise("", el.vbuffers);
Serialise("", el.layouts);
@@ -290,21 +288,12 @@ void Serialiser::Serialise(const char *name, GLPipelineState::VertexInput::Verte
Serialise("", el.Stride);
}
template<>
void Serialiser::Serialise(const char *name, GLPipelineState::VertexInput::IndexBuffer &el)
{
Serialise("", el.Buffer);
Serialise("", el.Offset);
Serialise("", el.Format);
}
template<>
void Serialiser::Serialise(const char *name, GLPipelineState::VertexInput &el)
{
Serialise("", el.attributes);
Serialise("", el.ibuffer);
Serialise("", el.vbuffers);
Serialise("", el.Topology);
}
template<>
@@ -507,6 +496,9 @@ void Serialiser::Serialise(const char *name, FetchDrawcall &el)
Serialise("", el.vertexOffset);
Serialise("", el.instanceOffset);
Serialise("", el.indexByteWidth);
Serialise("", el.topology);
Serialise("", el.context);
Serialise("", el.duration);
+8
View File
@@ -1062,6 +1062,14 @@ void WrappedID3D11DeviceContext::AddDrawcall(FetchDrawcall d, bool hasEvents)
draw.eventID = m_CurEventID;
draw.drawcallID = m_CurDrawcallID;
draw.indexByteWidth = 0;
if(m_CurrentPipelineState->IA.IndexFormat == DXGI_FORMAT_R16_UINT)
draw.indexByteWidth = 2;
if(m_CurrentPipelineState->IA.IndexFormat == DXGI_FORMAT_R32_UINT)
draw.indexByteWidth = 4;
draw.topology = MakePrimitiveTopology(m_CurrentPipelineState->IA.Topo);
for(int i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)
{
draw.outputs[i] = ResourceId();
-3
View File
@@ -416,8 +416,6 @@ D3D11PipelineState D3D11Replay::MakePipelineState()
/////////////////////////////////////////////////
// Input Assembler
/////////////////////////////////////////////////
ret.m_IA.Topology = MakePrimitiveTopology(rs->IA.Topo);
D3D11ResourceManager *rm = m_pDevice->GetResourceManager();
@@ -458,7 +456,6 @@ D3D11PipelineState D3D11Replay::MakePipelineState()
}
ret.m_IA.ibuffer.Buffer = rm->GetOriginalID(GetIDForResource(rs->IA.IndexBuffer));
ret.m_IA.ibuffer.Format = MakeResourceFormat(rs->IA.IndexFormat);
ret.m_IA.ibuffer.Offset = rs->IA.IndexOffset;
/////////////////////////////////////////////////
+25
View File
@@ -593,6 +593,31 @@ ResourceFormat MakeResourceFormat(WrappedOpenGL &gl, GLenum target, GLenum fmt)
return ret;
}
PrimitiveTopology MakePrimitiveTopology(const GLHookSet &gl, GLenum Topo)
{
switch(Topo)
{
default: return eTopology_Unknown;
case eGL_POINTS: return eTopology_PointList;
case eGL_LINE_STRIP: return eTopology_LineStrip;
case eGL_LINE_LOOP: return eTopology_LineLoop;
case eGL_LINES: return eTopology_LineList;
case eGL_LINE_STRIP_ADJACENCY: return eTopology_LineStrip_Adj;
case eGL_LINES_ADJACENCY: return eTopology_LineList_Adj;
case eGL_TRIANGLE_STRIP: return eTopology_TriangleStrip;
case eGL_TRIANGLE_FAN: return eTopology_TriangleFan;
case eGL_TRIANGLES: return eTopology_TriangleList;
case eGL_TRIANGLE_STRIP_ADJACENCY: return eTopology_TriangleStrip_Adj;
case eGL_TRIANGLES_ADJACENCY: return eTopology_TriangleList_Adj;
case eGL_PATCHES:
{
GLint patchCount = 3;
gl.glGetIntegerv(eGL_PATCH_VERTICES, &patchCount);
return PrimitiveTopology(eTopology_PatchList_1CPs+patchCount);
}
}
}
template<const bool CopyUniforms, const bool SerialiseUniforms>
static void ForAllProgramUniforms(const GLHookSet &gl, Serialiser *ser, GLuint progSrc, GLuint progDst, map<GLint, GLint> *locTranslate, bool writing)
{
+1
View File
@@ -86,6 +86,7 @@ GLenum ShaderEnum(size_t idx);
ResourceFormat MakeResourceFormat(WrappedOpenGL &gl, GLenum target, GLenum fmt);
GLenum MakeGLFormat(WrappedOpenGL &gl, GLenum target, ResourceFormat fmt);
PrimitiveTopology MakePrimitiveTopology(const GLHookSet &gl, GLenum Topo);
GLuint GetBoundVertexBuffer(const GLHookSet &gl, GLuint idx);
-4
View File
@@ -674,10 +674,6 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs)
m_ActiveConditional = false;
m_ActiveFeedback = false;
m_LastIndexSize = eGL_NONE;
m_LastIndexOffset = 0;
m_LastDrawMode = eGL_NONE;
m_DisplayListRecord = NULL;
#if defined(RELEASE)
-4
View File
@@ -166,10 +166,6 @@ class WrappedOpenGL
list<DrawcallTreeNode *> m_DrawcallStack;
GLenum m_LastIndexSize;
GLuint m_LastIndexOffset;
GLenum m_LastDrawMode;
// buffer used
vector<byte> m_ScratchBuf;
+1 -73
View File
@@ -837,35 +837,11 @@ void GLReplay::SavePipelineState()
// Index buffer
pipe.m_VtxIn.ibuffer.Offset = m_pDriver->m_LastIndexOffset;
pipe.m_VtxIn.ibuffer.Format = ResourceFormat();
pipe.m_VtxIn.ibuffer.Format.special = false;
pipe.m_VtxIn.ibuffer.Format.compCount = 1;
pipe.m_VtxIn.ibuffer.Format.compType = eCompType_UInt;
switch(m_pDriver->m_LastIndexSize)
{
default:
break;
case eGL_UNSIGNED_BYTE:
pipe.m_VtxIn.ibuffer.Format.compByteWidth = 1;
pipe.m_VtxIn.ibuffer.Format.strname = "GL_UNSIGNED_BYTE";
break;
case eGL_UNSIGNED_SHORT:
pipe.m_VtxIn.ibuffer.Format.compByteWidth = 2;
pipe.m_VtxIn.ibuffer.Format.strname = "GL_UNSIGNED_SHORT";
break;
case eGL_UNSIGNED_INT:
pipe.m_VtxIn.ibuffer.Format.compByteWidth = 4;
pipe.m_VtxIn.ibuffer.Format.strname = "GL_UNSIGNED_INT";
break;
}
void *ctx = m_ReplayCtx.ctx;
GLuint ibuffer = 0;
gl.glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&ibuffer);
pipe.m_VtxIn.ibuffer.Buffer = rm->GetOriginalID(rm->GetID(BufferRes(ctx, ibuffer)));
pipe.m_VtxIn.ibuffer = rm->GetOriginalID(rm->GetID(BufferRes(ctx, ibuffer)));
// Vertex buffers and attributes
GLint numVBufferBindings = 16;
@@ -1012,54 +988,6 @@ void GLReplay::SavePipelineState()
pipe.m_VtxIn.attributes[i].Format = fmt;
}
switch(m_pDriver->m_LastDrawMode)
{
default:
pipe.m_VtxIn.Topology = eTopology_Unknown;
break;
case eGL_POINTS:
pipe.m_VtxIn.Topology = eTopology_PointList;
break;
case eGL_LINE_STRIP:
pipe.m_VtxIn.Topology = eTopology_LineStrip;
break;
case eGL_LINE_LOOP:
pipe.m_VtxIn.Topology = eTopology_LineLoop;
break;
case eGL_LINES:
pipe.m_VtxIn.Topology = eTopology_LineList;
break;
case eGL_LINE_STRIP_ADJACENCY:
pipe.m_VtxIn.Topology = eTopology_LineStrip_Adj;
break;
case eGL_LINES_ADJACENCY:
pipe.m_VtxIn.Topology = eTopology_LineList_Adj;
break;
case eGL_TRIANGLE_STRIP:
pipe.m_VtxIn.Topology = eTopology_TriangleStrip;
break;
case eGL_TRIANGLE_FAN:
pipe.m_VtxIn.Topology = eTopology_TriangleFan;
break;
case eGL_TRIANGLES:
pipe.m_VtxIn.Topology = eTopology_TriangleList;
break;
case eGL_TRIANGLE_STRIP_ADJACENCY:
pipe.m_VtxIn.Topology = eTopology_TriangleStrip_Adj;
break;
case eGL_TRIANGLES_ADJACENCY:
pipe.m_VtxIn.Topology = eTopology_TriangleList_Adj;
break;
case eGL_PATCHES:
{
GLint patchCount = 3;
gl.glGetIntegerv(eGL_PATCH_VERTICES, &patchCount);
pipe.m_VtxIn.Topology = PrimitiveTopology(eTopology_PatchList_1CPs+patchCount);
break;
}
}
// Shader stages & Textures
GLint numTexUnits = 8;
+95 -75
View File
@@ -275,12 +275,12 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedback(GLenum mode, GLuint id)
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -329,12 +329,12 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackInstanced(GLenum mode, GLui
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -383,12 +383,12 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackStream(GLenum mode, GLuint
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -438,12 +438,12 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackStreamInstanced(GLenum mode
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -494,11 +494,11 @@ bool WrappedOpenGL::Serialise_glDrawArrays(GLenum mode, GLint first, GLsizei cou
draw.flags |= eDraw_Drawcall;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -550,12 +550,12 @@ bool WrappedOpenGL::Serialise_glDrawArraysIndirect(GLenum mode, const void *indi
draw.instanceOffset = params.baseInstance;
draw.flags |= eDraw_Drawcall|eDraw_Instanced|eDraw_Indirect;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -606,12 +606,12 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstanced(GLenum mode, GLint first, GL
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall|eDraw_Instanced;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -664,12 +664,12 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstancedBaseInstance(GLenum mode, GLi
draw.instanceOffset = BaseInstance;
draw.flags |= eDraw_Drawcall|eDraw_Instanced;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
return true;
}
@@ -725,14 +725,13 @@ bool WrappedOpenGL::Serialise_glDrawElements(GLenum mode, GLsizei count, GLenum
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -787,18 +786,18 @@ bool WrappedOpenGL::Serialise_glDrawElementsIndirect(GLenum mode, GLenum type, c
draw.name = name;
draw.numIndices = params.count;
draw.numInstances = params.instanceCount;
draw.indexOffset = params.firstIndex*IdxSize;
draw.indexOffset = params.firstIndex;
draw.vertexOffset = params.baseVertex;
draw.instanceOffset = params.baseInstance;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer|eDraw_Instanced|eDraw_Indirect;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
return true;
}
@@ -856,14 +855,13 @@ bool WrappedOpenGL::Serialise_glDrawRangeElements(GLenum mode, GLuint start, GLu
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -923,14 +921,13 @@ bool WrappedOpenGL::Serialise_glDrawRangeElementsBaseVertex(GLenum mode, GLuint
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -988,14 +985,13 @@ bool WrappedOpenGL::Serialise_glDrawElementsBaseVertex(GLenum mode, GLsizei coun
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -1053,14 +1049,13 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstanced(GLenum mode, GLsizei count
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -1120,14 +1115,13 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseInstance(GLenum mode, G
draw.instanceOffset = BaseInstance;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -1187,14 +1181,13 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertex(GLenum mode, GLs
draw.instanceOffset = 0;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -1256,14 +1249,13 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertexBaseInstance(GLen
draw.instanceOffset = BaseInstance;
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, true);
}
m_LastDrawMode = Mode;
m_LastIndexSize = Type;
m_LastIndexOffset = (GLuint)IdxOffset;
return true;
}
@@ -1346,6 +1338,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawArrays(GLenum mode, const GLint *first,
draw.name = name;
draw.flags |= eDraw_MultiDraw;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, false);
m_DrawcallStack.push_back(&m_DrawcallStack.back()->children.back());
@@ -1363,6 +1357,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawArrays(GLenum mode, const GLint *first,
ToStr::Get(draw.vertexOffset) + ")";
draw.flags |= eDraw_Drawcall;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddEvent(MULTI_DRAWARRAYS, desc);
AddDrawcall(draw, true);
@@ -1377,8 +1373,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawArrays(GLenum mode, const GLint *first,
m_CurEventID += Count+1;
}
m_LastDrawMode = Mode;
SAFE_DELETE_ARRAY(firstArray);
SAFE_DELETE_ARRAY(countArray);
@@ -1487,6 +1481,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawElements(GLenum mode, const GLsizei *co
draw.name = name;
draw.flags |= eDraw_MultiDraw;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, false);
@@ -1506,6 +1502,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawElements(GLenum mode, const GLsizei *co
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddEvent(MULTI_DRAWELEMENTS, desc);
AddDrawcall(draw, true);
@@ -1519,8 +1517,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElements(GLenum mode, const GLsizei *co
m_CurEventID += Count+1;
}
m_LastDrawMode = Mode;
SAFE_DELETE_ARRAY(countArray);
SAFE_DELETE_ARRAY(idxOffsArray);
@@ -1626,10 +1622,18 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsBaseVertex(GLenum mode, const G
ToStr::Get(Type) + "," +
ToStr::Get(Count) + ")";
uint32_t IdxSize =
Type == eGL_UNSIGNED_BYTE ? 1
: Type == eGL_UNSIGNED_SHORT ? 2
: /*Type == eGL_UNSIGNED_INT*/ 4;
FetchDrawcall draw;
draw.name = name;
draw.flags |= eDraw_MultiDraw;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, false);
@@ -1651,6 +1655,9 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsBaseVertex(GLenum mode, const G
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddEvent(MULTI_DRAWELEMENTSBASEVERTEX, desc);
AddDrawcall(draw, true);
@@ -1663,9 +1670,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsBaseVertex(GLenum mode, const G
{
m_CurEventID += Count+1;
}
m_LastIndexSize = Type;
m_LastDrawMode = Mode;
SAFE_DELETE_ARRAY(countArray);
SAFE_DELETE_ARRAY(baseArray);
@@ -1764,6 +1768,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirect(GLenum mode, const void
draw.flags |= eDraw_MultiDraw;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, false);
m_DrawcallStack.push_back(&m_DrawcallStack.back()->children.back());
@@ -1796,6 +1802,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirect(GLenum mode, const void
ToStr::Get(draw.instanceOffset) + ">)";
draw.flags |= eDraw_Drawcall|eDraw_Instanced|eDraw_Indirect;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddEvent(MULTI_DRAWARRAYS_INDIRECT, desc);
AddDrawcall(draw, true);
@@ -1810,8 +1818,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirect(GLenum mode, const void
m_CurEventID += Count+1;
}
m_LastDrawMode = Mode;
return true;
}
@@ -1893,8 +1899,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirect(GLenum mode, GLenum ty
m_Real.glDrawElementsInstancedBaseVertexBaseInstance(Mode, params.count, Type, (const void *)ptrdiff_t(params.firstIndex*IdxSize),
params.instanceCount, params.baseVertex, params.baseInstance);
m_LastIndexOffset = (GLuint)(params.firstIndex*IdxSize);
}
}
@@ -1909,10 +1913,18 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirect(GLenum mode, GLenum ty
ToStr::Get(Type) + "," +
ToStr::Get(Count) + ")";
uint32_t IdxSize =
Type == eGL_UNSIGNED_BYTE ? 1
: Type == eGL_UNSIGNED_SHORT ? 2
: /*Type == eGL_UNSIGNED_INT*/ 4;
FetchDrawcall draw;
draw.name = name;
draw.flags |= eDraw_MultiDraw;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, false);
@@ -1936,7 +1948,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirect(GLenum mode, GLenum ty
FetchDrawcall draw;
draw.numIndices = params.count;
draw.numInstances = params.instanceCount;
draw.indexOffset = params.firstIndex*IdxSize;
draw.indexOffset = params.firstIndex;
draw.vertexOffset = params.baseVertex;
draw.instanceOffset = params.baseInstance;
@@ -1947,6 +1959,9 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirect(GLenum mode, GLenum ty
ToStr::Get(draw.instanceOffset) + ">)";
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer|eDraw_Instanced|eDraw_Indirect;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddEvent(MULTI_DRAWELEMENTS_INDIRECT, desc);
AddDrawcall(draw, true);
@@ -1961,9 +1976,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirect(GLenum mode, GLenum ty
m_CurEventID += Count+1;
}
m_LastIndexSize = Type;
m_LastDrawMode = Mode;
return true;
}
@@ -2068,6 +2080,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirectCountARB(GLenum mode, GLi
draw.flags |= eDraw_MultiDraw;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddDrawcall(draw, false);
m_DrawcallStack.push_back(&m_DrawcallStack.back()->children.back());
@@ -2100,6 +2114,8 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirectCountARB(GLenum mode, GLi
ToStr::Get(draw.instanceOffset) + ">)";
draw.flags |= eDraw_Drawcall|eDraw_Instanced|eDraw_Indirect;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
AddEvent(MULTI_DRAWARRAYS_INDIRECT, desc);
AddDrawcall(draw, true);
@@ -2114,8 +2130,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirectCountARB(GLenum mode, GLi
m_CurEventID += realdrawcount+1;
}
m_LastDrawMode = Mode;
return true;
}
@@ -2208,8 +2222,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirectCountARB(GLenum mode, G
m_Real.glDrawElementsInstancedBaseVertexBaseInstance(Mode, params.count, Type, (const void *)ptrdiff_t(params.firstIndex*IdxSize),
params.instanceCount, params.baseVertex, params.baseInstance);
m_LastIndexOffset = (GLuint)(params.firstIndex*IdxSize);
}
}
@@ -2225,10 +2237,18 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirectCountARB(GLenum mode, G
ToStr::Get(realdrawcount) + ">, " +
ToStr::Get(MaxCount) + ")";
uint32_t IdxSize =
Type == eGL_UNSIGNED_BYTE ? 1
: Type == eGL_UNSIGNED_SHORT ? 2
: /*Type == eGL_UNSIGNED_INT*/ 4;
FetchDrawcall draw;
draw.name = name;
draw.flags |= eDraw_MultiDraw;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddDrawcall(draw, false);
@@ -2252,7 +2272,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirectCountARB(GLenum mode, G
FetchDrawcall draw;
draw.numIndices = params.count;
draw.numInstances = params.instanceCount;
draw.indexOffset = params.firstIndex*IdxSize;
draw.indexOffset = params.firstIndex;
draw.vertexOffset = params.baseVertex;
draw.instanceOffset = params.baseInstance;
@@ -2263,6 +2283,9 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirectCountARB(GLenum mode, G
ToStr::Get(draw.instanceOffset) + ")";
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer|eDraw_Instanced|eDraw_Indirect;
draw.topology = MakePrimitiveTopology(m_Real, Mode);
draw.indexByteWidth = IdxSize;
AddEvent(MULTI_DRAWELEMENTS_INDIRECT, desc);
AddDrawcall(draw, true);
@@ -2277,9 +2300,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirectCountARB(GLenum mode, G
m_CurEventID += realdrawcount+1;
}
m_LastIndexSize = Type;
m_LastDrawMode = Mode;
return true;
}