From 8a71039475212fb1e1a6dd2fd2911d02769637ef Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 8 Apr 2021 21:10:30 -0700 Subject: Improve robustness of gfx lifetime management. (#1788) * Improve robustness of gfx lifetime management. * fix clang error * fix clang error * Fix clang warning --- tools/gfx/cpu/render-cpu.cpp | 46 +++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) (limited to 'tools/gfx/cpu/render-cpu.cpp') diff --git a/tools/gfx/cpu/render-cpu.cpp b/tools/gfx/cpu/render-cpu.cpp index 8dbe5460a..8dd1ccae6 100644 --- a/tools/gfx/cpu/render-cpu.cpp +++ b/tools/gfx/cpu/render-cpu.cpp @@ -191,6 +191,7 @@ public: {} ~CPUTextureResource() { + free(m_data); } Result init(ITextureResource::SubresourceData const* initData) @@ -341,7 +342,7 @@ public: void* m_data = nullptr; }; -class CPUResourceView : public IResourceView, public RefObject +class CPUResourceView : public IResourceView, public ComObject { public: enum class Kind @@ -350,7 +351,7 @@ public: Texture, }; - SLANG_REF_OBJECT_IUNKNOWN_ALL + SLANG_COM_OBJECT_IUNKNOWN_ALL IResourceView* getInterface(const Guid& guid) { if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IResourceView) @@ -799,9 +800,9 @@ public: auto& bindingRange = layout->m_bindingRanges[bindingRangeIndex]; auto subObjectIndex = bindingRange.baseIndex + offset.bindingArrayIndex; - CPUShaderObject* subObject = m_objects[subObjectIndex]; + auto& subObject = m_objects[subObjectIndex]; - *outObject = ComPtr(subObject).detach(); + returnComPtr(outObject, subObject); return SLANG_OK; } @@ -1043,6 +1044,12 @@ public: class CPURootShaderObject : public CPUShaderObject { +public: + // Override default reference counting behavior to disable lifetime management via ComPtr. + // Root objects are managed by command buffer and does not need to be freed by the user. + SLANG_NO_THROW uint32_t SLANG_MCALL addRef() override { return 1; } + SLANG_NO_THROW uint32_t SLANG_MCALL release() override { return 1; } + public: SlangResult init(IDevice* device, CPUProgramLayout* programLayout); @@ -1056,7 +1063,7 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL getEntryPoint(UInt index, IShaderObject** outEntryPoint) override { - *outEntryPoint = ComPtr(m_entryPoints[index]).detach(); + returnComPtr(outEntryPoint, m_entryPoints[index]); return SLANG_OK; } virtual Result collectSpecializationArgs(ExtendedShaderObjectTypeList& args) override @@ -1083,7 +1090,7 @@ public: class CPUPipelineState : public PipelineStateBase { public: - CPUShaderProgram* getProgram() { return static_cast(m_program.get()); } + CPUShaderProgram* getProgram() { return static_cast(m_program.Ptr()); } void init(const ComputePipelineStateDesc& inDesc) { @@ -1194,11 +1201,14 @@ public: const ITextureResource::SubresourceData* initData, ITextureResource** outResource) override { - RefPtr texture = new CPUTextureResource(desc); + TextureResource::Desc srcDesc(desc); + srcDesc.setDefaults(initialUsage); + + RefPtr texture = new CPUTextureResource(srcDesc); SLANG_RETURN_ON_FAIL(texture->init(initData)); - *outResource = texture.detach(); + returnComPtr(outResource, texture); return SLANG_OK; } @@ -1214,7 +1224,7 @@ public: { SLANG_RETURN_ON_FAIL(resource->setData(0, desc.sizeInBytes, initData)); } - *outResource = resource.detach(); + returnComPtr(outResource, resource); return SLANG_OK; } @@ -1223,7 +1233,7 @@ public: { auto texture = static_cast(inTexture); RefPtr view = new CPUTextureView(desc, texture); - *outView = view.detach(); + returnComPtr(outView, view); return SLANG_OK; } @@ -1232,7 +1242,7 @@ public: { auto buffer = static_cast(inBuffer); RefPtr view = new CPUBufferView(desc, buffer); - *outView = view.detach(); + returnComPtr(outView, view); return SLANG_OK; } @@ -1241,7 +1251,7 @@ public: ShaderObjectLayoutBase** outLayout) override { RefPtr cpuLayout = new CPUShaderObjectLayout(this, typeLayout); - *outLayout = cpuLayout.detach(); + returnRefPtrMove(outLayout, cpuLayout); return SLANG_OK; } @@ -1254,19 +1264,19 @@ public: RefPtr result = new CPUShaderObject(); SLANG_RETURN_ON_FAIL(result->init(this, cpuLayout)); - *outObject = result.detach(); + returnComPtr(outObject, result); return SLANG_OK; } - virtual Result createRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override + virtual Result createRootShaderObject(IShaderProgram* program, ShaderObjectBase** outObject) override { auto cpuProgram = static_cast(program); auto cpuProgramLayout = cpuProgram->layout; RefPtr result = new CPURootShaderObject(); SLANG_RETURN_ON_FAIL(result->init(this, cpuProgramLayout)); - *outObject = result.detach(); + returnRefPtrMove(outObject, result); return SLANG_OK; } @@ -1292,7 +1302,7 @@ public: cpuProgram->layout = cpuProgramLayout; } - *outProgram = cpuProgram.detach(); + returnComPtr(outProgram, cpuProgram); return SLANG_OK; } @@ -1301,7 +1311,7 @@ public: { RefPtr state = new CPUPipelineState(); state->init(desc); - *outState = state.detach(); + returnComPtr(outState, state); return Result(); } @@ -1410,7 +1420,7 @@ SlangResult SLANG_MCALL createCPUDevice(const IDevice::Desc* desc, IDevice** out { RefPtr result = new CPUDevice(); SLANG_RETURN_ON_FAIL(result->initialize(*desc)); - *outDevice = result.detach(); + returnComPtr(outDevice, result); return SLANG_OK; } -- cgit v1.2.3