diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 8e97ecaf9..7a33ccb28 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -769,11 +769,6 @@ WrappedID3D12Device::WrappedID3D12Device(ID3D12Device *realDevice, D3D12InitPara SCOPED_LOCK(m_DeviceWrappersLock); m_DeviceWrappers[m_pDevice] = this; } - - if(!RenderDoc::Inst().IsReplayApp()) - { - FirstFrame(NULL); - } } WrappedID3D12Device::~WrappedID3D12Device() diff --git a/util/test/demos/d3d11/d3d11_simple_triangle.cpp b/util/test/demos/d3d11/d3d11_simple_triangle.cpp index a1505eb45..42a80591a 100644 --- a/util/test/demos/d3d11/d3d11_simple_triangle.cpp +++ b/util/test/demos/d3d11/d3d11_simple_triangle.cpp @@ -44,7 +44,13 @@ RD_TEST(D3D11_Simple_Triangle, D3D11GraphicsTest) ID3D11VertexShaderPtr vs = CreateVS(vsblob); ID3D11PixelShaderPtr ps = CreatePS(psblob); - ID3D11BufferPtr vb = MakeBuffer().Vertex().Data(DefaultTri); + ID3D11BufferPtr vb = MakeBuffer().Vertex().Mappable().Size(sizeof(DefaultTri)); + + D3D11_MAPPED_SUBRESOURCE mapped = Map(vb, 0, D3D11_MAP_WRITE_DISCARD); + + memcpy(mapped.pData, DefaultTri, sizeof(DefaultTri)); + + ctx->Unmap(vb, 0); // make a simple texture so that the structured data includes texture initial states ID3D11Texture2DPtr fltTex = MakeTexture(DXGI_FORMAT_R32G32B32A32_FLOAT, 4, 4).RTV(); diff --git a/util/test/tests/D3D11/D3D11_Frame0.py b/util/test/tests/D3D11/D3D11_Frame0.py new file mode 100644 index 000000000..667a54e35 --- /dev/null +++ b/util/test/tests/D3D11/D3D11_Frame0.py @@ -0,0 +1,69 @@ +import renderdoc as rd +import rdtest + + +class D3D11_Frame0(rdtest.TestCase): + demos_test_name = 'D3D11_Simple_Triangle' + demos_frame_cap = 0 + + def check_capture(self): + first_action = self.get_first_action() + + found = False + sdfile = self.controller.GetStructuredFile() + for e in first_action.events: + c: rd.SDChunk = sdfile.chunks[e.chunkIndex] + if 'Unmap' in c.name: + found = True + + if not found: + raise rdtest.TestFailureException("Expected an Unmap() chunk in frame 0, but couldn't find it!") + + last_action: rd.ActionDescription = self.get_last_action() + + self.controller.SetFrameEvent(last_action.eventId, True) + + self.check_triangle(out=last_action.copyDestination) + + self.check_export(self.capture_filename) + + action = self.find_action("Draw") + + self.controller.SetFrameEvent(action.eventId, False) + + postvs_data = self.get_postvs(action, rd.MeshDataStage.VSOut, 0, action.numIndices) + + postvs_ref = { + 0: { + 'vtx': 0, + 'idx': 0, + 'SV_POSITION': [-0.5, -0.5, 0.0, 1.0], + 'COLOR': [0.0, 1.0, 0.0, 1.0], + 'TEXCOORD': [0.0, 0.0], + }, + 1: { + 'vtx': 1, + 'idx': 1, + 'SV_POSITION': [0.0, 0.5, 0.0, 1.0], + 'COLOR': [0.0, 1.0, 0.0, 1.0], + 'TEXCOORD': [0.0, 1.0], + }, + 2: { + 'vtx': 2, + 'idx': 2, + 'SV_POSITION': [0.5, -0.5, 0.0, 1.0], + 'COLOR': [0.0, 1.0, 0.0, 1.0], + 'TEXCOORD': [1.0, 0.0], + }, + } + + self.check_mesh_data(postvs_ref, postvs_data) + + # Check that nothing breaks if we call typical enumeration functions on resources + for res in self.controller.GetResources(): + res: rd.ResourceDescription + + self.controller.GetShaderEntryPoints(res.resourceId) + self.controller.GetUsage(res.resourceId) + self.controller.GetBufferData(res.resourceId, 0, 0) + self.controller.GetTextureData(res.resourceId, rd.Subresource()) diff --git a/util/test/tests/D3D12/D3D12_Frame0.py b/util/test/tests/D3D12/D3D12_Frame0.py new file mode 100644 index 000000000..3718b10a4 --- /dev/null +++ b/util/test/tests/D3D12/D3D12_Frame0.py @@ -0,0 +1,70 @@ +import renderdoc as rd +import rdtest + + +class D3D12_Frame0(rdtest.TestCase): + demos_test_name = 'D3D12_Simple_Triangle' + demos_frame_cap = 0 + + def check_capture(self): + first_action = self.get_first_action() + + found = False + sdfile = self.controller.GetStructuredFile() + for e in first_action.events: + c: rd.SDChunk = sdfile.chunks[e.chunkIndex] + if 'Unmap' in c.name: + found = True + + if not found: + raise rdtest.TestFailureException("Expected an Unmap() chunk in frame 0, but couldn't find it!") + + last_action: rd.ActionDescription = self.get_last_action() + + self.controller.SetFrameEvent(last_action.eventId, True) + + self.check_triangle(out=last_action.copyDestination) + + self.check_export(self.capture_filename) + + action = self.find_action("Draw") + + self.controller.SetFrameEvent(action.eventId, False) + + postvs_data = self.get_postvs(action, rd.MeshDataStage.VSOut, 0, action.numIndices) + + postvs_ref = { + 0: { + 'vtx': 0, + 'idx': 0, + 'SV_POSITION': [-0.5, -0.5, 0.0, 1.0], + 'COLOR': [0.0, 1.0, 0.0, 1.0], + 'TEXCOORD': [0.0, 0.0], + }, + 1: { + 'vtx': 1, + 'idx': 1, + 'SV_POSITION': [0.0, 0.5, 0.0, 1.0], + 'COLOR': [0.0, 1.0, 0.0, 1.0], + 'TEXCOORD': [0.0, 1.0], + }, + 2: { + 'vtx': 2, + 'idx': 2, + 'SV_POSITION': [0.5, -0.5, 0.0, 1.0], + 'COLOR': [0.0, 1.0, 0.0, 1.0], + 'TEXCOORD': [1.0, 0.0], + }, + } + + self.check_mesh_data(postvs_ref, postvs_data) + + # Check that nothing breaks if we call typical enumeration functions on resources + for res in self.controller.GetResources(): + res: rd.ResourceDescription + + self.controller.GetShaderEntryPoints(res.resourceId) + self.controller.GetUsage(res.resourceId) + self.controller.GetBufferData(res.resourceId, 0, 0) + self.controller.GetTextureData(res.resourceId, rd.Subresource()) + diff --git a/util/test/tests/GL/GL_Frame0.py b/util/test/tests/GL/GL_Frame0.py new file mode 100644 index 000000000..b05297de4 --- /dev/null +++ b/util/test/tests/GL/GL_Frame0.py @@ -0,0 +1,72 @@ +import renderdoc as rd +import rdtest + + +class GL_Frame0(rdtest.TestCase): + demos_test_name = 'GL_Simple_Triangle' + demos_frame_cap = 0 + + def check_capture(self): + first_action = self.get_first_action() + + found = False + sdfile = self.controller.GetStructuredFile() + for e in first_action.events: + c: rd.SDChunk = sdfile.chunks[e.chunkIndex] + if 'glBufferData' in c.name: + found = True + + if not found: + raise rdtest.TestFailureException("Expected an glBufferData() chunk in frame 0, but couldn't find it!") + + last_action: rd.ActionDescription = self.get_last_action() + + self.controller.SetFrameEvent(last_action.eventId, True) + + self.check_triangle(out=last_action.copyDestination) + + self.check_export(self.capture_filename) + + action = self.find_action("Draw") + + self.controller.SetFrameEvent(action.eventId, False) + + postvs_data = self.get_postvs(action, rd.MeshDataStage.VSOut, 0, action.numIndices) + + postvs_ref = { + 0: { + 'vtx': 0, + 'idx': 0, + 'gl_Position': [-0.5, -0.5, 0.0, 1.0], + 'v2f_block.pos': [-0.5, -0.5, 0.0, 1.0], + 'v2f_block.col': [0.0, 1.0, 0.0, 1.0], + 'v2f_block.uv': [0.0, 0.0, 0.0, 1.0], + }, + 1: { + 'vtx': 1, + 'idx': 1, + 'gl_Position': [0.0, 0.5, 0.0, 1.0], + 'v2f_block.pos': [0.0, 0.5, 0.0, 1.0], + 'v2f_block.col': [0.0, 1.0, 0.0, 1.0], + 'v2f_block.uv': [0.0, 1.0, 0.0, 1.0], + }, + 2: { + 'vtx': 2, + 'idx': 2, + 'gl_Position': [0.5, -0.5, 0.0, 1.0], + 'v2f_block.pos': [0.5, -0.5, 0.0, 1.0], + 'v2f_block.col': [0.0, 1.0, 0.0, 1.0], + 'v2f_block.uv': [1.0, 0.0, 0.0, 1.0], + }, + } + + self.check_mesh_data(postvs_ref, postvs_data) + + # Check that nothing breaks if we call typical enumeration functions on resources + for res in self.controller.GetResources(): + res: rd.ResourceDescription + + self.controller.GetShaderEntryPoints(res.resourceId) + self.controller.GetUsage(res.resourceId) + self.controller.GetBufferData(res.resourceId, 0, 0) + self.controller.GetTextureData(res.resourceId, rd.Subresource()) diff --git a/util/test/tests/Vulkan/VK_Frame0.py b/util/test/tests/Vulkan/VK_Frame0.py new file mode 100644 index 000000000..2b6456647 --- /dev/null +++ b/util/test/tests/Vulkan/VK_Frame0.py @@ -0,0 +1,72 @@ +import renderdoc as rd +import rdtest + + +class VK_Frame0(rdtest.TestCase): + demos_test_name = 'VK_Simple_Triangle' + demos_frame_cap = 0 + + def check_capture(self): + first_action = self.get_first_action() + + found = False + sdfile = self.controller.GetStructuredFile() + for e in first_action.events: + c: rd.SDChunk = sdfile.chunks[e.chunkIndex] + if 'vkUnmapMemory' in c.name: + found = True + + if not found: + raise rdtest.TestFailureException("Expected an vkUnmapMemory() chunk in frame 0, but couldn't find it!") + + last_action: rd.ActionDescription = self.get_last_action() + + self.controller.SetFrameEvent(last_action.eventId, True) + + self.check_triangle(out=last_action.copyDestination) + + self.check_export(self.capture_filename) + + action = self.find_action("Draw") + + self.controller.SetFrameEvent(action.eventId, False) + + postvs_data = self.get_postvs(action, rd.MeshDataStage.VSOut, 0, action.numIndices) + + postvs_ref = { + 0: { + 'vtx': 0, + 'idx': 0, + 'gl_PerVertex_var.gl_Position': [-0.5, 0.5, 0.0, 1.0], + 'vertOut.pos': [-0.5, 0.5, 0.0, 1.0], + 'vertOut.col': [0.0, 1.0, 0.0, 1.0], + 'vertOut.uv': [0.0, 0.0, 0.0, 1.0], + }, + 1: { + 'vtx': 1, + 'idx': 1, + 'gl_PerVertex_var.gl_Position': [0.0, -0.5, 0.0, 1.0], + 'vertOut.pos': [0.0, -0.5, 0.0, 1.0], + 'vertOut.col': [0.0, 1.0, 0.0, 1.0], + 'vertOut.uv': [0.0, 1.0, 0.0, 1.0], + }, + 2: { + 'vtx': 2, + 'idx': 2, + 'gl_PerVertex_var.gl_Position': [0.5, 0.5, 0.0, 1.0], + 'vertOut.pos': [0.5, 0.5, 0.0, 1.0], + 'vertOut.col': [0.0, 1.0, 0.0, 1.0], + 'vertOut.uv': [1.0, 0.0, 0.0, 1.0], + }, + } + + self.check_mesh_data(postvs_ref, postvs_data) + + # Check that nothing breaks if we call typical enumeration functions on resources + for res in self.controller.GetResources(): + res: rd.ResourceDescription + + self.controller.GetShaderEntryPoints(res.resourceId) + self.controller.GetUsage(res.resourceId) + self.controller.GetBufferData(res.resourceId, 0, 0) + self.controller.GetTextureData(res.resourceId, rd.Subresource())