diff options
Diffstat (limited to 'tools/render-test/slang-support.cpp')
| -rw-r--r-- | tools/render-test/slang-support.cpp | 251 |
1 files changed, 0 insertions, 251 deletions
diff --git a/tools/render-test/slang-support.cpp b/tools/render-test/slang-support.cpp index a9079b52c..094c306d1 100644 --- a/tools/render-test/slang-support.cpp +++ b/tools/render-test/slang-support.cpp @@ -174,255 +174,4 @@ ShaderCompiler* createSlangShaderCompiler( return result; } -SlangResult generateTextureResource(const InputTextureDesc& inputDesc, int bindFlags, Renderer* renderer, Slang::RefPtr<TextureResource>& textureOut) -{ - using namespace Slang; - - TextureData texData; - generateTextureData(texData, inputDesc); - - TextureResource::Desc textureResourceDesc; - textureResourceDesc.init(); - - textureResourceDesc.format = Format::RGBA_Unorm_UInt8; - textureResourceDesc.numMipLevels = texData.mipLevels; - textureResourceDesc.arraySize = inputDesc.arrayLength; - textureResourceDesc.bindFlags = bindFlags; - - // It's the same size in all dimensions - Resource::Type type = Resource::Type::Unknown; - switch (inputDesc.dimension) - { - case 1: - { - type = Resource::Type::Texture1D; - textureResourceDesc.size.init(inputDesc.size); - break; - } - case 2: - { - type = inputDesc.isCube ? Resource::Type::TextureCube : Resource::Type::Texture2D; - textureResourceDesc.size.init(inputDesc.size, inputDesc.size); - break; - } - case 3: - { - type = Resource::Type::Texture3D; - textureResourceDesc.size.init(inputDesc.size, inputDesc.size, inputDesc.size); - break; - } - } - - const int effectiveArraySize = textureResourceDesc.calcEffectiveArraySize(type); - const int numSubResources = textureResourceDesc.calcNumSubResources(type); - - Resource::Usage initialUsage = Resource::Usage::GenericRead; - TextureResource::Data initData; - - List<ptrdiff_t> mipRowStrides; - mipRowStrides.SetSize(textureResourceDesc.numMipLevels); - List<const void*> subResources; - subResources.SetSize(numSubResources); - - // Set up the src row strides - for (int i = 0; i < textureResourceDesc.numMipLevels; i++) - { - const int mipWidth = TextureResource::calcMipSize(textureResourceDesc.size.width, i); - mipRowStrides[i] = mipWidth * sizeof(uint32_t); - } - - // Set up pointers the the data - { - int subResourceIndex = 0; - const int numGen = int(texData.dataBuffer.Count()); - for (int i = 0; i < numSubResources; i++) - { - subResources[i] = texData.dataBuffer[subResourceIndex].Buffer(); - // Wrap around - subResourceIndex = (subResourceIndex + 1 >= numGen) ? 0 : (subResourceIndex + 1); - } - } - - initData.mipRowStrides = mipRowStrides.Buffer(); - initData.numMips = textureResourceDesc.numMipLevels; - initData.numSubResources = numSubResources; - initData.subResources = subResources.Buffer(); - - textureOut = renderer->createTextureResource(type, Resource::Usage::GenericRead, textureResourceDesc, &initData); - - return textureOut ? SLANG_OK : SLANG_FAIL; -} - -SlangResult createInputBufferResource(const InputBufferDesc& inputDesc, bool isOutput, size_t bufferSize, const void* initData, Renderer* renderer, Slang::RefPtr<BufferResource>& bufferOut) -{ - using namespace Slang; - - Resource::Usage initialUsage = Resource::Usage::GenericRead; - - BufferResource::Desc srcDesc; - srcDesc.init(bufferSize); - - int bindFlags = 0; - if (inputDesc.type == InputBufferType::ConstantBuffer) - { - bindFlags |= Resource::BindFlag::ConstantBuffer; - srcDesc.cpuAccessFlags |= Resource::AccessFlag::Write; - initialUsage = Resource::Usage::ConstantBuffer; - } - else - { - bindFlags |= Resource::BindFlag::UnorderedAccess | Resource::BindFlag::PixelShaderResource | Resource::BindFlag::NonPixelShaderResource; - srcDesc.elementSize = inputDesc.stride; - initialUsage = Resource::Usage::UnorderedAccess; - } - - if (isOutput) - { - srcDesc.cpuAccessFlags |= Resource::AccessFlag::Read; - } - - srcDesc.bindFlags = bindFlags; - - RefPtr<BufferResource> bufferResource = renderer->createBufferResource(initialUsage, srcDesc, initData); - if (!bufferResource) - { - return SLANG_FAIL; - } - - bufferOut = bufferResource; - return SLANG_OK; -} - -static BindingState::SamplerDesc _calcSamplerDesc(const InputSamplerDesc& srcDesc) -{ - BindingState::SamplerDesc dstDesc; - dstDesc.isCompareSampler = srcDesc.isCompareSampler; - return dstDesc; -} - -SlangResult createBindingStateDesc(ShaderInputLayoutEntry* srcEntries, int numEntries, Renderer* renderer, BindingState::Desc& descOut) -{ - using namespace Slang; - - const int textureBindFlags = Resource::BindFlag::NonPixelShaderResource | Resource::BindFlag::PixelShaderResource; - - descOut.clear(); - for (int i = 0; i < numEntries; i++) - { - const ShaderInputLayoutEntry& srcEntry = srcEntries[i]; - - BindingState::RegisterDesc registerDesc; - registerDesc.registerSets[int(BindingState::ShaderStyle::Hlsl)] = descOut.addRegisterSet(srcEntry.hlslBinding); - registerDesc.registerSets[int(BindingState::ShaderStyle::Glsl)] = descOut.addRegisterSet(srcEntry.glslBinding.Buffer(), int(srcEntry.glslBinding.Count())); - - switch (srcEntry.type) - { - case ShaderInputType::Buffer: - { - const InputBufferDesc& srcBuffer = srcEntry.bufferDesc; - - const size_t bufferSize = srcEntry.bufferData.Count() * sizeof(uint32_t); - - RefPtr<BufferResource> bufferResource; - SLANG_RETURN_ON_FAIL(createInputBufferResource(srcEntry.bufferDesc, srcEntry.isOutput, bufferSize, srcEntry.bufferData.Buffer(), renderer, bufferResource)); - - descOut.addBufferResource(bufferResource, registerDesc); - break; - } - case ShaderInputType::CombinedTextureSampler: - { - RefPtr<TextureResource> texture; - SLANG_RETURN_ON_FAIL(generateTextureResource(srcEntry.textureDesc, textureBindFlags, renderer, texture)); - descOut.addCombinedTextureSampler(texture, _calcSamplerDesc(srcEntry.samplerDesc), registerDesc); - break; - } - case ShaderInputType::Texture: - { - RefPtr<TextureResource> texture; - SLANG_RETURN_ON_FAIL(generateTextureResource(srcEntry.textureDesc, textureBindFlags, renderer, texture)); - - descOut.addTextureResource(texture, registerDesc); - break; - } - case ShaderInputType::Sampler: - { - descOut.addSampler(_calcSamplerDesc(srcEntry.samplerDesc), registerDesc); - break; - } - default: - { - assert(!"Unhandled type"); - return SLANG_FAIL; - } - } - } - - return SLANG_OK; -} - -SlangResult createBindingStateDesc(const ShaderInputLayout& layout, Renderer* renderer, BindingState::Desc& descOut) -{ - SLANG_RETURN_ON_FAIL(createBindingStateDesc(layout.entries.Buffer(), int(layout.entries.Count()), renderer, descOut)); - descOut.m_numRenderTargets = layout.numRenderTargets; - - return SLANG_OK; -} - -SlangResult serializeBindingOutput(const ShaderInputLayout& layout, BindingState* bindingState, Renderer* renderer, const char* fileName) -{ - // Submit the work - renderer->submitGpuWork(); - // Wait until everything is complete - renderer->waitForGpu(); - - FILE * f = fopen(fileName, "wb"); - if (!f) - { - return SLANG_FAIL; - } - - const BindingState::Desc& bindingStateDesc = bindingState->getDesc(); - // Must be the same amount of entries - assert(bindingStateDesc.m_bindings.Count() == layout.entries.Count()); - - const int numBindings = int(bindingStateDesc.m_bindings.Count()); - - for (int i = 0; i < numBindings; ++i) - { - const auto& layoutBinding = layout.entries[i]; - const auto& binding = bindingStateDesc.m_bindings[i]; - - if (layoutBinding.isOutput) - { - if (binding.resource && binding.resource->isBuffer()) - { - BufferResource* bufferResource = static_cast<BufferResource*>(binding.resource.Ptr()); - const size_t bufferSize = bufferResource->getDesc().sizeInBytes; - - unsigned int* ptr = (unsigned int*)renderer->map(bufferResource, MapFlavor::HostRead); - if (!ptr) - { - fclose(f); - return SLANG_FAIL; - } - - const int size = int(bufferSize / sizeof(unsigned int)); - for (int i = 0; i < size; ++i) - { - fprintf(f, "%X\n", ptr[i]); - } - renderer->unmap(bufferResource); - } - else - { - printf("invalid output type at %d.\n", i); - } - } - } - fclose(f); - - return SLANG_OK; -} - - } // renderer_test |
