From 96d7b9424b1c99b19dd9ffe5132014b85d818b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 14 Jan 2021 22:03:01 +0100 Subject: [PATCH] Renderer: Handle null textures in shader binding --- .../OpenGLRenderer/OpenGLShaderBinding.cpp | 73 ++++++++++++------- .../VulkanRenderer/VulkanShaderBinding.cpp | 14 ++-- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp b/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp index adca247e9..492331cc0 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp @@ -65,38 +65,49 @@ namespace Nz const TextureBinding& texBinding = std::get(binding.content); - OpenGLTexture& glTexture = static_cast(*texBinding.texture); - OpenGLTextureSampler& glSampler = static_cast(*texBinding.sampler); - auto& textureDescriptor = m_owner.GetTextureDescriptor(m_poolIndex, m_bindingIndex, resourceIndex); textureDescriptor.bindingIndex = binding.bindingIndex; - textureDescriptor.texture = glTexture.GetTexture().GetObjectId(); - textureDescriptor.sampler = glSampler.GetSampler(glTexture.GetLevelCount() > 1).GetObjectId(); - - switch (glTexture.GetType()) + if (OpenGLTexture* glTexture = static_cast(texBinding.texture)) { - case ImageType_2D: - textureDescriptor.textureTarget = GL::TextureTarget::Target2D; - break; + textureDescriptor.texture = glTexture->GetTexture().GetObjectId(); - case ImageType_2D_Array: - textureDescriptor.textureTarget = GL::TextureTarget::Target2D_Array; - break; + if (OpenGLTextureSampler* glSampler = static_cast(texBinding.sampler)) + textureDescriptor.sampler = glSampler->GetSampler(glTexture->GetLevelCount() > 1).GetObjectId(); + else + textureDescriptor.sampler = 0; - case ImageType_3D: - textureDescriptor.textureTarget = GL::TextureTarget::Target3D; - break; + switch (glTexture->GetType()) + { + case ImageType_2D: + textureDescriptor.textureTarget = GL::TextureTarget::Target2D; + break; - case ImageType_Cubemap: - textureDescriptor.textureTarget = GL::TextureTarget::Cubemap; - break; + case ImageType_2D_Array: + textureDescriptor.textureTarget = GL::TextureTarget::Target2D_Array; + break; - case ImageType_1D: - case ImageType_1D_Array: - default: - throw std::runtime_error("unsupported texture type"); + case ImageType_3D: + textureDescriptor.textureTarget = GL::TextureTarget::Target3D; + break; + + case ImageType_Cubemap: + textureDescriptor.textureTarget = GL::TextureTarget::Cubemap; + break; + + case ImageType_1D: + case ImageType_1D_Array: + default: + throw std::runtime_error("unsupported texture type"); + } } + else + { + textureDescriptor.sampler = 0; + textureDescriptor.texture = 0; + textureDescriptor.textureTarget = GL::TextureTarget::Target2D; + } + break; } @@ -107,15 +118,21 @@ namespace Nz const UniformBufferBinding& uboBinding = std::get(binding.content); - OpenGLBuffer& glBuffer = *static_cast(uboBinding.buffer); - if (glBuffer.GetType() != BufferType_Uniform) - throw std::runtime_error("expected uniform buffer"); - auto& uboDescriptor = m_owner.GetUniformBufferDescriptor(m_poolIndex, m_bindingIndex, resourceIndex); uboDescriptor.bindingIndex = binding.bindingIndex; - uboDescriptor.buffer = glBuffer.GetBuffer().GetObjectId(); uboDescriptor.offset = uboBinding.offset; uboDescriptor.size = uboBinding.range; + + if (OpenGLBuffer* glBuffer = static_cast(uboBinding.buffer)) + { + if (glBuffer->GetType() != BufferType_Uniform) + throw std::runtime_error("expected uniform buffer"); + + uboDescriptor.buffer = glBuffer->GetBuffer().GetObjectId(); + } + else + uboDescriptor.buffer = 0; + break; } } diff --git a/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp b/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp index 58f9731ac..bf86a2989 100644 --- a/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp +++ b/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp @@ -32,31 +32,29 @@ namespace Nz if constexpr (std::is_same_v) { - VulkanTexture& vkTexture = *static_cast(arg.texture); - VulkanTextureSampler& vkSampler = *static_cast(arg.sampler); + VulkanTexture* vkTexture = static_cast(arg.texture); + VulkanTextureSampler* vkSampler = static_cast(arg.sampler); VkDescriptorImageInfo& imageInfo = imageBinding.emplace_back(); imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - imageInfo.imageView = vkTexture.GetImageView(); - imageInfo.sampler = vkSampler.GetSampler(); + imageInfo.imageView = (vkTexture) ? vkTexture->GetImageView() : VK_NULL_HANDLE; + imageInfo.sampler = (vkSampler) ? vkSampler->GetSampler() : VK_NULL_HANDLE; writeOp.descriptorCount = 1; writeOp.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writeOp.pImageInfo = &imageInfo; } else if constexpr (std::is_same_v) { - VulkanBuffer& vkBuffer = *static_cast(arg.buffer); + VulkanBuffer* vkBuffer = static_cast(arg.buffer); VkDescriptorBufferInfo& bufferInfo = bufferBinding.emplace_back(); - bufferInfo.buffer = vkBuffer.GetBuffer(); + bufferInfo.buffer = (vkBuffer) ? vkBuffer->GetBuffer() : VK_NULL_HANDLE; bufferInfo.offset = arg.offset; bufferInfo.range = arg.range; writeOp.descriptorCount = 1; writeOp.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - writeOp.pBufferInfo = &bufferInfo; } else