From a5ac4999b4dea546a7ef824669ab1809224b6448 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 4 Mar 2021 16:25:58 -0800 Subject: Refactor `gfx` to surface `CommandBuffer` interface. (#1735) * Refactor `gfx` to surface `CommandBuffer` interface. * Fixes. * Fix code review issues, and make vulkan runnable on devices without VK_EXT_extended_dynamic_states. * Update solution files * Move out-of-date examples to examples/experimental Co-authored-by: Yong He --- examples/shader-object/main.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'examples/shader-object/main.cpp') diff --git a/examples/shader-object/main.cpp b/examples/shader-object/main.cpp index 9b1b4de72..d368cd9aa 100644 --- a/examples/shader-object/main.cpp +++ b/examples/shader-object/main.cpp @@ -136,7 +136,7 @@ int main() // interacting with the graphics API. Slang::ComPtr renderer; IRenderer::Desc rendererDesc = {}; - rendererDesc.rendererType = RendererType::CUDA; + rendererDesc.rendererType = RendererType::DirectX11; SLANG_RETURN_ON_FAIL(gfxCreateRenderer(&rendererDesc, renderer.writeRef())); // Now we can load the shader code. @@ -146,7 +146,7 @@ int main() slang::ProgramLayout* slangReflection; SLANG_RETURN_ON_FAIL(loadShaderProgram(renderer, shaderProgram, slangReflection)); - // Create a pipelien state with the loaded shader. + // Create a pipeline state with the loaded shader. gfx::ComputePipelineStateDesc pipelineDesc = {}; pipelineDesc.program = shaderProgram.get(); ComPtr pipelineState; @@ -211,17 +211,26 @@ int main() // We have set up all required parameters in entry-point object, now it is time // to bind the pipeline and root object and launch the kernel. - renderer->beginFrame(); - renderer->setPipelineState(pipelineState); - SLANG_RETURN_ON_FAIL(renderer->bindRootShaderObject(gfx::PipelineType::Compute, rootObject)); - renderer->dispatchCompute(1, 1, 1); - renderer->endFrame(); + { + ICommandQueue::Desc queueDesc = {ICommandQueue::QueueType::Graphics}; + auto queue = renderer->createCommandQueue(queueDesc); + auto commandBuffer = queue->createCommandBuffer(); + auto encoder = commandBuffer->encodeComputeCommands(); + encoder->setPipelineState(pipelineState); + encoder->bindRootShaderObject(rootObject); + encoder->dispatchCompute(1, 1, 1); + encoder->endEncoding(); + commandBuffer->close(); + queue->executeCommandBuffer(commandBuffer); + queue->wait(); + } // Read back the results. - renderer->waitForGpu(); - float* result = (float*)renderer->map(numbersBuffer, gfx::MapFlavor::HostRead); + ComPtr resultBlob; + SLANG_RETURN_ON_FAIL(renderer->readBufferResource( + numbersBuffer, 0, numberCount * sizeof(float), resultBlob.writeRef())); + auto result = reinterpret_cast(resultBlob->getBufferPointer()); for (int i = 0; i < numberCount; i++) printf("%f\n", result[i]); - renderer->unmap(numbersBuffer); return SLANG_OK; } -- cgit v1.2.3