diff --git a/renderdoc/api/replay/control_types.h b/renderdoc/api/replay/control_types.h index 38e078d94..8c1f70b1e 100644 --- a/renderdoc/api/replay/control_types.h +++ b/renderdoc/api/replay/control_types.h @@ -31,14 +31,25 @@ struct OutputConfig struct MeshFormat { + ResourceId idxbuf; + uint32_t idxByteWidth; ResourceId buf; + uint32_t offset; uint32_t stride; + uint32_t compCount; uint32_t compByteWidth; FormatComponentType compType; SpecialFormat specialFormat; + bool showAlpha; + + PrimitiveTopology topo; + + bool32 unproject; + float nearPlane; + float farPlane; }; struct MeshDisplay @@ -50,14 +61,13 @@ struct MeshDisplay FloatVector cameraRot; bool32 ortho; - float fov, aspect, nearPlane, farPlane; + float fov, aspect; bool32 thisDrawOnly; uint32_t highlightVert; MeshFormat position; MeshFormat second; - bool32 unproject; FloatVector prevMeshColour; FloatVector currentMeshColour; diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h index 3bf04d2fd..1755db23c 100644 --- a/renderdoc/api/replay/data_types.h +++ b/renderdoc/api/replay/data_types.h @@ -254,10 +254,3 @@ struct PixelModification bool32 depthTestFailed; bool32 stencilTestFailed; }; - -struct PostVSMeshData -{ - rdctype::array buf; - uint32_t numVerts; - PrimitiveTopology topo; -}; diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 03f955121..fb8114f13 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -164,7 +164,7 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetCBufferVariableCo extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SaveTexture(ReplayRenderer *rend, const TextureSave &saveData, const char *path); -extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetPostVSData(ReplayRenderer *rend, MeshDataStage stage, PostVSMeshData *data); +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetPostVSData(ReplayRenderer *rend, MeshDataStage stage, MeshFormat *data); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetMinMax(ReplayRenderer *rend, ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, PixelValue *minval, PixelValue *maxval); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetHistogram(ReplayRenderer *rend, ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, float minval, float maxval, bool32 channels[4], rdctype::array *histogram); diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 5e142b295..11c6cad52 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -118,7 +118,7 @@ class ImageViewer : public IReplayDriver void FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector &outvars, const vector &data) {} vector GetBufferData(ResourceId buff, uint32_t offset, uint32_t len) { return vector(); } void InitPostVSBuffers(uint32_t frameID, uint32_t eventID) {} - PostVSMeshData GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) { PostVSMeshData ret; RDCEraseEl(ret); return ret; } + MeshFormat GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) { MeshFormat ret; RDCEraseEl(ret); return ret; } ResourceId RenderOverlay(ResourceId texid, TextureDisplayOverlay overlay, uint32_t frameID, uint32_t eventID, const vector &passEvents) { return ResourceId(); } ShaderReflection *GetShader(ResourceId id) { return NULL; } bool HasCallstacks() { return false; } diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 43b20eace..bf046c3b2 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -535,11 +535,20 @@ void Serialiser::Serialise(const char *name, ShaderVariable &el) } template<> -void Serialiser::Serialise(const char *name, PostVSMeshData &el) +void Serialiser::Serialise(const char *name, MeshFormat &el) { - Serialise("", el.numVerts); - Serialise("", el.topo); Serialise("", el.buf); + Serialise("", el.offset); + Serialise("", el.stride); + Serialise("", el.compCount); + Serialise("", el.compByteWidth); + Serialise("", el.compType); + Serialise("", el.specialFormat); + Serialise("", el.showAlpha); + Serialise("", el.topo); + Serialise("", el.unproject); + Serialise("", el.nearPlane); + Serialise("", el.farPlane); } template<> @@ -1298,9 +1307,9 @@ void ProxySerialiser::InitPostVSBuffers(uint32_t frameID, uint32_t eventID) } } -PostVSMeshData ProxySerialiser::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) +MeshFormat ProxySerialiser::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) { - PostVSMeshData ret; + MeshFormat ret; m_ToReplaySerialiser->Serialise("", frameID); m_ToReplaySerialiser->Serialise("", eventID); diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index ac2fbe482..3fb738cc6 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -288,7 +288,7 @@ class ProxySerialiser : public IReplayDriver, Callstack::StackResolver byte *GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, bool resolve, bool forceRGBA8unorm, float blackPoint, float whitePoint, size_t &dataSize); void InitPostVSBuffers(uint32_t frameID, uint32_t eventID); - PostVSMeshData GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); + MeshFormat GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); ResourceId RenderOverlay(ResourceId texid, TextureDisplayOverlay overlay, uint32_t frameID, uint32_t eventID, const vector &passEvents); diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index aece975bf..c2694fc9d 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -3718,18 +3718,39 @@ PostVSData D3D11DebugManager::GetPostVSBuffers(uint32_t frameID, uint32_t eventI return empty; } -PostVSMeshData D3D11DebugManager::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) +MeshFormat D3D11DebugManager::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) { - PostVSMeshData ret; + MeshFormat ret; PostVSData postvs = GetPostVSBuffers(frameID, eventID); PostVSData::StageData s = postvs.GetStage(stage); - ret.numVerts = s.numVerts; - ret.topo = MakePrimitiveTopology(s.topo); - if(s.buf != NULL) - ret.buf = GetBufferData(s.buf, 0, 0); + + if(s.useIndices && s.idxBuf) + ret.idxbuf = ((WrappedID3D11Buffer *)s.idxBuf)->GetResourceID(); else - RDCWARN("No buffer for this stage!"); + ret.idxbuf = ResourceId(); + ret.idxByteWidth = s.idxFmt == DXGI_FORMAT_R16_UINT ? 2 : 4; + + if(s.buf) + ret.buf = ((WrappedID3D11Buffer *)s.buf)->GetResourceID(); + else + ret.buf = ResourceId(); + + ret.offset = s.posOffset; + ret.stride = s.vertStride; + + ret.compCount = 4; + ret.compByteWidth = 4; + ret.compType = eCompType_Float; + ret.specialFormat = eSpecial_Unknown; + + ret.showAlpha = false; + + ret.topo = MakePrimitiveTopology(s.topo); + + ret.unproject = true; + ret.nearPlane = s.nearPlane; + ret.farPlane = s.farPlane; return ret; } @@ -4645,7 +4666,7 @@ void D3D11DebugManager::RenderMesh(uint32_t frameID, const vector &eve m_PrevMeshFmt = resFmt; m_PrevMeshFmt2 = resFmt2; - if(cfg.unproject || events.size() > 1) + if(cfg.position.unproject || events.size() > 1) { float nearp = 0.1f; float farp = 1000.0f; @@ -4663,17 +4684,17 @@ void D3D11DebugManager::RenderMesh(uint32_t frameID, const vector &eve } } + if(cfg.position.nearPlane > -FLT_MAX) nearp = cfg.position.nearPlane; + if(cfg.position.farPlane > -FLT_MAX) farp = cfg.position.farPlane; + if(cfg.aspect > 0.0f) aspect = cfg.aspect; + // the derivation of the projection matrix might not be right (hell, it could be an // orthographic projection). But it'll be close enough likely. - Matrix4f guessProj = Matrix4f::Perspective(cfg.fov, - cfg.nearPlane > -FLT_MAX ? cfg.nearPlane : nearp, - cfg.farPlane > -FLT_MAX ? cfg.farPlane : farp, - cfg.aspect > 0.0f ? cfg.aspect : aspect); + Matrix4f guessProj = Matrix4f::Perspective(cfg.fov, nearp, farp, aspect); if(cfg.ortho) { - guessProj = Matrix4f::Orthographic(cfg.nearPlane > -FLT_MAX ? cfg.nearPlane : nearp, - cfg.farPlane > -FLT_MAX ? cfg.farPlane : farp); + guessProj = Matrix4f::Orthographic(nearp, farp); } guessProjInv = guessProj.Inverse(); @@ -4927,7 +4948,7 @@ void D3D11DebugManager::RenderMesh(uint32_t frameID, const vector &eve } // axis markers - if(!cfg.unproject) + if(!cfg.position.unproject) { m_pImmediateContext->PSSetConstantBuffers(0, 1, &m_DebugRender.GenericPSCBuffer); @@ -4977,9 +4998,8 @@ void D3D11DebugManager::RenderMesh(uint32_t frameID, const vector &eve } else { - PostVSMeshData postvs = GetPostVSBuffers(frameID, events.back(), stage); - m_HighlightCache.data.resize(postvs.buf.count); - memcpy(&m_HighlightCache.data[0], postvs.buf.elems, postvs.buf.count); + MeshFormat postvs = GetPostVSBuffers(frameID, events.back(), stage); + m_HighlightCache.data = GetBufferData(postvs.buf, 0, 0); const PostVSData::StageData &stagedata = GetPostVSBuffers(frameID, events.back()).GetStage(stage); @@ -5321,7 +5341,7 @@ void D3D11DebugManager::RenderMesh(uint32_t frameID, const vector &eve // prepare rendering (for both vertices & primitives) // if data is from post transform, it will be in clipspace - if(cfg.unproject) + if(cfg.position.unproject) { vertexData.ModelViewProj = projMat.Mul(camMat.Mul(guessProjInv)); m_pImmediateContext->VSSetShader(m_DebugRender.WireframeHomogVS, NULL, 0); @@ -5443,12 +5463,12 @@ void D3D11DebugManager::RenderMesh(uint32_t frameID, const vector &eve } } - if(cfg.unproject) + if(cfg.position.unproject) m_pImmediateContext->VSSetShader(m_DebugRender.WireframeVS, NULL, 0); } // 'fake' helper frustum - if(cfg.unproject) + if(cfg.position.unproject) { UINT strides[] = { sizeof(Vec3f) }; UINT offsets[] = { 0 }; diff --git a/renderdoc/driver/d3d11/d3d11_debug.h b/renderdoc/driver/d3d11/d3d11_debug.h index e74bfafee..36c28a87c 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.h +++ b/renderdoc/driver/d3d11/d3d11_debug.h @@ -114,7 +114,7 @@ class D3D11DebugManager void InitPostVSBuffers(uint32_t frameID, uint32_t eventID); PostVSData GetPostVSBuffers(uint32_t frameID, uint32_t eventID); - PostVSMeshData GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); + MeshFormat GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); uint32_t GetStructCount(ID3D11UnorderedAccessView *uav); vector GetBufferData(ID3D11Buffer *buff, uint32_t offset, uint32_t len); diff --git a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp index 2b10422e9..08f2ade67 100644 --- a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp @@ -167,6 +167,12 @@ HRESULT WrappedID3D11Device::CreateBuffer( record->AddChunk(chunk); record->SetDataPtr(chunk->GetData()); } + else + { + WrappedID3D11Buffer *w = (WrappedID3D11Buffer *)wrapped; + + GetResourceManager()->AddLiveResource(w->GetResourceID(), wrapped); + } *ppBuffer = wrapped; } diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 5bd8d06b8..abca9ac34 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -1260,7 +1260,7 @@ bool D3D11Replay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mi return m_pDevice->GetDebugManager()->GetHistogram(texid, sliceFace, mip, sample, minval, maxval, channels, histogram); } -PostVSMeshData D3D11Replay::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) +MeshFormat D3D11Replay::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) { return m_pDevice->GetDebugManager()->GetPostVSBuffers(frameID, eventID, stage); } diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index f2c6d2b48..20c2ccc54 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -87,7 +87,7 @@ class D3D11Replay : public IReplayDriver bool GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, float *minval, float *maxval); bool GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, float minval, float maxval, bool channels[4], vector &histogram); - PostVSMeshData GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); + MeshFormat GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); vector GetBufferData(ResourceId buff, uint32_t offset, uint32_t len); byte *GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, bool resolve, bool forceRGBA8unorm, float blackPoint, float whitePoint, size_t &dataSize); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 1763b36a6..e0c743e6a 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -2168,9 +2168,9 @@ void GLReplay::FreeCustomShader(ResourceId id) RDCUNIMPLEMENTED("FreeCustomShader"); } -PostVSMeshData GLReplay::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) +MeshFormat GLReplay::GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) { - PostVSMeshData ret; + MeshFormat ret; RDCEraseEl(ret); GLNOTIMP("GLReplay::GetPostVSBuffers"); diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index e057bdc4d..7ac3b010f 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -87,7 +87,7 @@ class GLReplay : public IReplayDriver bool GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, float *minval, float *maxval); bool GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, float minval, float maxval, bool channels[4], vector &histogram); - PostVSMeshData GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); + MeshFormat GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage); vector GetBufferData(ResourceId buff, uint32_t offset, uint32_t len); byte *GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, bool resolve, bool forceRGBA8unorm, float blackPoint, float whitePoint, size_t &dataSize); diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index cfa03407b..93c30cc99 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -81,7 +81,7 @@ class IRemoteDriver virtual ResourceId GetLiveID(ResourceId id) = 0; - virtual PostVSMeshData GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) = 0; + virtual MeshFormat GetPostVSBuffers(uint32_t frameID, uint32_t eventID, MeshDataStage stage) = 0; virtual vector GetBufferData(ResourceId buff, uint32_t offset, uint32_t len) = 0; virtual byte *GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, bool resolve, bool forceRGBA8unorm, float blackPoint, float whitePoint, size_t &dataSize) = 0; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 9983ada53..651e2b602 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -356,15 +356,14 @@ bool ReplayRenderer::GetUsage(ResourceId id, rdctype::array *usage) return false; } -bool ReplayRenderer::GetPostVSData(MeshDataStage stage, PostVSMeshData *data) +bool ReplayRenderer::GetPostVSData(MeshDataStage stage, MeshFormat *data) { if(data == NULL) return false; FetchDrawcall *draw = GetDrawcallByEID(m_EventID, m_LastDeferredEvent); - PostVSMeshData ret; - ret.numVerts = 0; - ret.topo = eTopology_Unknown; + MeshFormat ret; + RDCEraseEl(ret); if(draw == NULL || (draw->flags & eDraw_Drawcall) == 0) return false; @@ -1522,7 +1521,7 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetCBufferVariableCo extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SaveTexture(ReplayRenderer *rend, const TextureSave &saveData, const char *path) { return rend->SaveTexture(saveData, path); } -extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetPostVSData(ReplayRenderer *rend, MeshDataStage stage, PostVSMeshData *data) +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetPostVSData(ReplayRenderer *rend, MeshDataStage stage, MeshFormat *data) { return rend->GetPostVSData(stage, data); } extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetMinMax(ReplayRenderer *rend, ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, PixelValue *minval, PixelValue *maxval) diff --git a/renderdoc/replay/replay_renderer.h b/renderdoc/replay/replay_renderer.h index 7cacb114b..f292f47ad 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -166,7 +166,7 @@ struct ReplayRenderer bool DebugPixel(uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace); bool DebugThread(uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace); - bool GetPostVSData(MeshDataStage stage, PostVSMeshData *data); + bool GetPostVSData(MeshDataStage stage, MeshFormat *data); bool GetMinMax(ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, PixelValue *minval, PixelValue *maxval); bool GetHistogram(ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, float minval, float maxval, bool channels[4], rdctype::array *histogram); diff --git a/renderdocui/Interop/FetchInfo.cs b/renderdocui/Interop/FetchInfo.cs index 64b8102bf..6f9a510e3 100644 --- a/renderdocui/Interop/FetchInfo.cs +++ b/renderdocui/Interop/FetchInfo.cs @@ -361,14 +361,25 @@ namespace renderdoc [StructLayout(LayoutKind.Sequential)] public struct MeshFormat { + public ResourceId idxbuf; + public UInt32 idxByteWidth; public ResourceId buf; + public UInt32 offset; public UInt32 stride; + public UInt32 compCount; public UInt32 compByteWidth; public FormatComponentType compType; public SpecialFormat specialFormat; + public bool showAlpha; + + public PrimitiveTopology topo; + + public bool unproject; + public float nearPlane; + public float farPlane; }; [StructLayout(LayoutKind.Sequential)] @@ -382,14 +393,13 @@ namespace renderdoc public bool ortho = false; public float fov = 90.0f; - public float aspect = 0.0f, nearPlane = 0.0f, farPlane = 0.0f; + public float aspect = 0.0f; public bool thisDrawOnly = true; public UInt32 highlightVert; public MeshFormat position; public MeshFormat secondary; - public bool unproject; public FloatVector prevMeshColour = new FloatVector(); public FloatVector currentMeshColour = new FloatVector(); @@ -542,13 +552,4 @@ namespace renderdoc !stencilTestFailed; } }; - - [StructLayout(LayoutKind.Sequential)] - public class PostVSMeshData - { - [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] - public byte[] buf; - public UInt32 numVerts; - public PrimitiveTopology topo; - }; } diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index bc8d3916d..fa0e5d7a0 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -636,16 +636,17 @@ namespace renderdoc return ret; } - public PostVSMeshData GetPostVSData(MeshDataStage stage) + public MeshFormat GetPostVSData(MeshDataStage stage) { - IntPtr mem = CustomMarshal.Alloc(typeof(PostVSMeshData)); + IntPtr mem = CustomMarshal.Alloc(typeof(MeshFormat)); - PostVSMeshData ret = null; + MeshFormat ret = new MeshFormat(); + ret.buf = ResourceId.Null; bool success = ReplayRenderer_GetPostVSData(m_Real, stage, mem); if (success) - ret = (PostVSMeshData)CustomMarshal.PtrToStructure(mem, typeof(PostVSMeshData), true); + ret = (MeshFormat)CustomMarshal.PtrToStructure(mem, typeof(MeshFormat), true); CustomMarshal.Free(mem); diff --git a/renderdocui/Windows/BufferViewer.cs b/renderdocui/Windows/BufferViewer.cs index 98f9fdb0f..09f3f07d9 100644 --- a/renderdocui/Windows/BufferViewer.cs +++ b/renderdocui/Windows/BufferViewer.cs @@ -844,18 +844,18 @@ namespace renderdocui.Windows ret.Buffers = new byte[1][]; - if (postvs == null) + if (postvs.buf == ResourceId.Null) { ret.IndexCount = 0; ret.Topology = PrimitiveTopology.Unknown; } else { - ret.Buffers[0] = postvs.buf; + ret.Buffers[0] = r.GetBufferData(postvs.buf, 0, 0); ret.Topology = postvs.topo; - ret.IndexCount = postvs.numVerts; + ret.IndexCount = (uint)ret.Buffers[0].Length / postvs.stride; uint stride = 0; foreach (var f in input.BufferFormats) @@ -867,7 +867,7 @@ namespace renderdocui.Windows ret.Indices = null; - if (postvs != null && type == MeshDataStage.VSOut && + if (postvs.buf != ResourceId.Null && type == MeshDataStage.VSOut && (input.Drawcall.flags & DrawcallFlags.UseIBuffer) > 0 && input.IndexBuffer != ResourceId.Null) { ret.IndexCount = input.Drawcall.numIndices; @@ -2222,11 +2222,11 @@ namespace renderdocui.Windows m_MeshDisplay.position.specialFormat = pos.format.special ? pos.format.specialFormat : SpecialFormat.Unknown; m_MeshDisplay.position.showAlpha = false; - m_MeshDisplay.unproject = false; + m_MeshDisplay.position.unproject = false; if ((ui.m_Stage == MeshDataStage.VSOut && !m_Core.CurPipelineState.IsTessellationEnabled) || ui.m_Stage == MeshDataStage.GSOut) { - m_MeshDisplay.unproject = pos.name.ToUpperInvariant() == "SV_POSITION"; + m_MeshDisplay.position.unproject = pos.name.ToUpperInvariant() == "SV_POSITION"; } } @@ -2292,7 +2292,7 @@ namespace renderdocui.Windows float.TryParse(nearGuess.Text, out near); } - m_MeshDisplay.nearPlane = near; + m_MeshDisplay.position.nearPlane = near; nearGuess.Text = near > -float.MaxValue ? near.ToString("G") : ""; @@ -2304,7 +2304,7 @@ namespace renderdocui.Windows float.TryParse(farGuess.Text, out far); } - m_MeshDisplay.farPlane = far; + m_MeshDisplay.position.farPlane = far; farGuess.Text = far > -float.MaxValue ? far.ToString("G") : "";