载入中...
搜索中...
未找到
GraphicsShaderResources.cpp
浏览该文件的文档.
55void MeshShaderResourcesDeleter::operator()(MeshShaderResources* resources) const noexcept { delete resources; }
63Result<void> validateMeshResourceShaderReload(const GpuShader& shader, std::span<const uint32_t> vertex,
76Result<void> Graphics::replaceMeshShaderResources(Shader& shader, const std::vector<uint32_t>& vertSpv,
81 if (!initialized || found == ownedGpuShaders.end() || !(*found)->isMesh3D || (*found)->isHair3D ||
83 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Expected an owned, ordinary mesh shader outside frame submission", "shader.resources"));
85 inputs.images.size() > 16 || inputs.constants.size() > 65536 || inputs.constants.size() % 16 != 0)
88 "Expected resource inputs, at most 16 images and 64 KiB of aligned uniform bytes", "shader.resources"));
97 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "Instance matrix buffer exceeds device limits", "shader.resources"));
101 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "Resource program exceeds device descriptor or uniform limits", "shader.resources"));
103 if (!bindings.insert(image.binding).second) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Duplicate resource image binding", "shader.resources"));
106 const auto dimensionLimit = image.dimension == ShaderImageDimension::Image3D ? limits.maxImageDimension3D
109 if (image.width > dimensionLimit || image.height > dimensionLimit || image.depth > limits.maxImageDimension3D ||
111 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "Resource image exceeds device dimensions", "shader.resources"));
112 const auto flags = device.physical_device->getFormatProperties(imageFormat(image.format)).optimalTilingFeatures;
113 const auto required = vk::FormatFeatureFlagBits::eSampledImage | vk::FormatFeatureFlagBits::eTransferDst;
118 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "Device cannot sample the requested image format/filter", "shader.resources"));
136 if (!inputs.constants.empty()) layout.emplace_back(32, vk::DescriptorType::eUniformBuffer, 1, stages);
138 layout.emplace_back(33, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eVertex);
139 resources.setLayout = device->createDescriptorSetLayoutUnique(vk::DescriptorSetLayoutCreateInfo{{}, layout});
142 poolSizes.emplace_back(vk::DescriptorType::eCombinedImageSampler, uint32_t(inputs.images.size()));
144 if (!inputs.instanceMatrices.empty()) poolSizes.emplace_back(vk::DescriptorType::eStorageBuffer, 1);
145 resources.pool = device->createDescriptorPoolUnique(vk::DescriptorPoolCreateInfo{{}, 1, poolSizes});
148 device->allocateDescriptorSets(vk::DescriptorSetAllocateInfo{*resources.pool, 1, &setLayout})[0];
234 output->sampler = vk::UniqueSampler(createVkSampler(input.sampler, input.mipLevels), device.instance);
272 command.copyBufferToImage(buffer, *output->image, vk::ImageLayout::eTransferDstOptimal, copies);
286 device->updateDescriptorSets(vk::WriteDescriptorSet{candidate->resourceSet, input.binding, 0, 1,
303 const vk::DescriptorBufferInfo descriptor{resources.constants->buffer, 0, inputs.constants.size()};
305 vk::WriteDescriptorSet{candidate->resourceSet, 32, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr,
316 const vk::DescriptorBufferInfo descriptor{resources.instances->buffer, 0, inputs.instanceMatrices.size()};
318 vk::WriteDescriptorSet{candidate->resourceSet, 33, 0, 1, vk::DescriptorType::eStorageBuffer, nullptr,
323 vertex, fragSpv, candidate->pipelineLayout, activeScenePass(), activeSceneSamples(), shader.meshBlend,
329 vertex, fragSpv, candidate->pipelineLayout, hdrOffscreen3DRenderPass, vk::SampleCountFlagBits::e1,
334 {candidate->mesh3dPipeline, candidate->mesh3dOffscreenPipeline, candidate->mesh3dHdrOffscreenPipeline})
336 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Failed, error.what(), "shader.resources"));
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static constexpr uint32_t kPushConstantBytes
Definition Shader.h:43
Result< void > replaceMeshShaderResources(Shader &shader, const std::vector< uint32_t > &vertSpv, const std::vector< uint32_t > &fragSpv, const ShaderResourceInputs &resources) override
Replace mesh shader resources.
Definition GraphicsShaderResources.cpp:76
void waitForSharedGpuResources()
Block until all in-flight GPU work (all frames) has completed.
Definition Graphics.cpp:885
Result< void > validateResourceShaderStages(std::span< const uint32_t > vertex, std::span< const uint32_t > fragment, const ShaderResourceInputs &inputs)
Validate resource shader stages.
Definition ShaderResourceValidation.cpp:128
Definition VulkanSequence.h:9
Result< void > validateMeshResourceShaderReload(const GpuShader &shader, std::span< const uint32_t > vertex, std::span< const uint32_t > fragment)
Validate mesh resource shader reload.
Definition GraphicsShaderResources.cpp:63
bool isMeshResourceImageShared(const GpuShader &first, std::uint32_t firstSlot, const GpuShader &second, std::uint32_t secondSlot)
Query whether two live shader image slots share immutable GPU storage. @ownership Borrows both shader...
Definition GraphicsShaderResources.cpp:56
std::uint32_t meshResourceInstanceCount(const GpuShader &shader)
Immutable uploaded instance count; render-thread read, no retained borrow.
Definition GraphicsShaderResources.cpp:72
ShaderImageFormat
Explicit sampled-image storage; sRGB conversion never affects alpha.
Definition ShaderResources.h:14
@ RGBA8Srgb
@ BGRA8Srgb
@ RGBA16Float
@ RGBA16Unorm
@ RGBA32Float
Result< std::uint32_t > shaderInstanceMatrixCount(std::span< const std::byte > bytes)
Validate packed instance records without GPU access; returns the record count.
Definition ShaderResources.cpp:92
Result< std::vector< ShaderImageRegion > > shaderImageRegions(const ShaderImageInput &image)
Validate layout, dimensions, sampler compatibility and exact payload size.
Definition ShaderResources.cpp:16
@ InvalidArgument
@ Unsupported
@ Failed
Inputs for descriptor set 1 of a resource mesh program.
Definition ShaderResources.h:67
void operator()(MeshShaderResources *resources) const noexcept
Operator .
Definition GraphicsShaderResources.cpp:55
std::vector< ShaderImageInput > shapes
Definition GraphicsShaderResources.cpp:46
std::size_t constantSize
Definition GraphicsShaderResources.cpp:47
std::vector< std::shared_ptr< ResourceImage > > images
Definition GraphicsShaderResources.cpp:44
vk::UniqueDescriptorSetLayout setLayout
Definition GraphicsShaderResources.cpp:51
vk::UniquePipelineLayout pipelineLayout
Definition GraphicsShaderResources.cpp:53
vk::UniqueDescriptorPool pool
Definition GraphicsShaderResources.cpp:52
std::unique_ptr< vkb::GenericBuffer > constants
Definition GraphicsShaderResources.cpp:45
std::unique_ptr< vkb::GenericBuffer > instances
Definition GraphicsShaderResources.cpp:49
std::vector< std::byte > instanceBytes
Definition GraphicsShaderResources.cpp:50
std::vector< std::byte > constantBytes
Definition GraphicsShaderResources.cpp:48