diff options
Diffstat (limited to 'src/gui/rhi/qrhivulkan.cpp')
-rw-r--r-- | src/gui/rhi/qrhivulkan.cpp | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/src/gui/rhi/qrhivulkan.cpp b/src/gui/rhi/qrhivulkan.cpp index e7faa0cadd..84ca835392 100644 --- a/src/gui/rhi/qrhivulkan.cpp +++ b/src/gui/rhi/qrhivulkan.cpp @@ -2462,9 +2462,10 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb, i { QVkShaderResourceBindings *srbD = QRHI_RES(QVkShaderResourceBindings, srb); - QVarLengthArray<VkDescriptorBufferInfo, 4> bufferInfos; - QVarLengthArray<VkDescriptorImageInfo, 4> imageInfos; - QVarLengthArray<VkWriteDescriptorSet, 8> writeInfos; + QVarLengthArray<VkDescriptorBufferInfo, 8> bufferInfos; + QVarLengthArray<VkDescriptorImageInfo, 8> imageInfos; + QVarLengthArray<VkWriteDescriptorSet, 12> writeInfos; + QVarLengthArray<QPair<int, int>, 12> infoIndices; const bool updateAll = descSetIdx < 0; int frameSlot = updateAll ? 0 : descSetIdx; @@ -2481,6 +2482,9 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb, i writeInfo.dstBinding = uint32_t(b->binding); writeInfo.descriptorCount = 1; + int bufferInfoIndex = -1; + int imageInfoIndex = -1; + switch (b->type) { case QRhiShaderResourceBinding::UniformBuffer: { @@ -2496,8 +2500,8 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb, i bufInfo.range = VkDeviceSize(b->u.ubuf.maybeSize ? b->u.ubuf.maybeSize : bufD->m_size); // be nice and assert when we know the vulkan device would die a horrible death due to non-aligned reads Q_ASSERT(aligned(bufInfo.offset, ubufAlign) == bufInfo.offset); + bufferInfoIndex = bufferInfos.count(); bufferInfos.append(bufInfo); - writeInfo.pBufferInfo = &bufferInfos.last(); } break; case QRhiShaderResourceBinding::SampledTexture: @@ -2513,8 +2517,8 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb, i imageInfo.sampler = samplerD->sampler; imageInfo.imageView = texD->imageView; imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfoIndex = imageInfos.count(); imageInfos.append(imageInfo); - writeInfo.pImageInfo = &imageInfos.last(); } break; case QRhiShaderResourceBinding::ImageLoad: @@ -2531,8 +2535,8 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb, i imageInfo.sampler = VK_NULL_HANDLE; imageInfo.imageView = view; imageInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL; + imageInfoIndex = imageInfos.count(); imageInfos.append(imageInfo); - writeInfo.pImageInfo = &imageInfos.last(); } } break; @@ -2548,8 +2552,8 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb, i bufInfo.buffer = bufD->m_type == QRhiBuffer::Dynamic ? bufD->buffers[frameSlot] : bufD->buffers[0]; bufInfo.offset = VkDeviceSize(b->u.ubuf.offset); bufInfo.range = VkDeviceSize(b->u.ubuf.maybeSize ? b->u.ubuf.maybeSize : bufD->m_size); + bufferInfoIndex = bufferInfos.count(); bufferInfos.append(bufInfo); - writeInfo.pBufferInfo = &bufferInfos.last(); } break; default: @@ -2557,10 +2561,20 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb, i } writeInfos.append(writeInfo); + infoIndices.append({ bufferInfoIndex, imageInfoIndex }); } ++frameSlot; } + for (int i = 0, writeInfoCount = writeInfos.count(); i < writeInfoCount; ++i) { + const int bufferInfoIndex = infoIndices[i].first; + const int imageInfoIndex = infoIndices[i].second; + if (bufferInfoIndex >= 0) + writeInfos[i].pBufferInfo = &bufferInfos[bufferInfoIndex]; + else if (imageInfoIndex >= 0) + writeInfos[i].pImageInfo = &imageInfos[imageInfoIndex]; + } + df->vkUpdateDescriptorSets(dev, uint32_t(writeInfos.count()), writeInfos.constData(), 0, nullptr); } @@ -4046,9 +4060,9 @@ QRhiTexture *QRhiVulkan::createTexture(QRhiTexture::Format format, const QSize & QRhiSampler *QRhiVulkan::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler::Filter mipmapMode, - QRhiSampler::AddressMode u, QRhiSampler::AddressMode v) + QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w) { - return new QVkSampler(this, magFilter, minFilter, mipmapMode, u, v); + return new QVkSampler(this, magFilter, minFilter, mipmapMode, u, v, w); } QRhiTextureRenderTarget *QRhiVulkan::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, @@ -5543,8 +5557,8 @@ VkImageView QVkTexture::imageViewForLevel(int level) } QVkSampler::QVkSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, - AddressMode u, AddressMode v) - : QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v) + AddressMode u, AddressMode v, AddressMode w) + : QRhiSampler(rhi, magFilter, minFilter, mipmapMode, u, v, w) { } @@ -6208,6 +6222,11 @@ bool QVkGraphicsPipeline::build() rastInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rastInfo.cullMode = toVkCullMode(m_cullMode); rastInfo.frontFace = toVkFrontFace(m_frontFace); + if (m_depthBias != 0 || !qFuzzyIsNull(m_slopeScaledDepthBias)) { + rastInfo.depthBiasEnable = true; + rastInfo.depthBiasConstantFactor = float(m_depthBias); + rastInfo.depthBiasSlopeFactor = m_slopeScaledDepthBias; + } rastInfo.lineWidth = rhiD->hasWideLines ? m_lineWidth : 1.0f; pipelineInfo.pRasterizationState = &rastInfo; |