diff options
author | Mike Krus <mike.krus@kdab.com> | 2021-01-07 10:43:33 +0000 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-01-11 09:28:08 +0000 |
commit | b6255dd1e953a3a5413b27735d73692afaa7849d (patch) | |
tree | 7533c0d28a1733c62f7951664e22cf5733171148 | |
parent | 25cd421bb17641336fb3123cf31587ab737f50dd (diff) |
Clean up error logging
Making it more readable and add details of failed FBO creation.
Change-Id: I14a65a5ed6165597acc52f38dc5d1cb908732911
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
(cherry picked from commit 40b663e42c2a53ca1b8dc35f7d8b68516aad85a4)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderer.cpp | 92 |
1 files changed, 49 insertions, 43 deletions
diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp index 4925fd251..0fe6cd348 100644 --- a/src/plugins/renderers/rhi/renderer/renderer.cpp +++ b/src/plugins/renderers/rhi/renderer/renderer.cpp @@ -915,8 +915,8 @@ void Renderer::buildGraphicsPipelines(RHIGraphicsPipeline *graphicsPipeline, rhiSwapChain = swapchain->swapChain; } - auto onFailure = [&] { - qCWarning(Backend) << "Failed to build graphics pipeline"; + auto onFailure = [&](const char* msg) { + qCWarning(Backend) << "Failed to build graphics pipeline:" << msg; }; PipelineUBOSet *uboSet = graphicsPipeline->uboSet(); @@ -924,16 +924,12 @@ void Renderer::buildGraphicsPipelines(RHIGraphicsPipeline *graphicsPipeline, // Setup shaders const QShader& vertexShader = shader->shaderStage(QShader::VertexStage); - if (!vertexShader.isValid()) { - qCWarning(Backend) << "Invalid vertex shader"; - return onFailure(); - } + if (!vertexShader.isValid()) + return onFailure("Invalid vertex shader"); const QShader& fragmentShader = shader->shaderStage(QShader::FragmentStage); - if (!fragmentShader.isValid()) { - qCWarning(Backend) << "Invalid fragment shader"; - return onFailure(); - } + if (!fragmentShader.isValid()) + return onFailure("Invalid fragment shader"); // Set Resource Bindings const std::vector<QRhiShaderResourceBinding> resourceBindings = uboSet->resourceLayout(shader); @@ -942,10 +938,8 @@ void Renderer::buildGraphicsPipelines(RHIGraphicsPipeline *graphicsPipeline, graphicsPipeline->setShaderResourceBindings(shaderResourceBindings); shaderResourceBindings->setBindings(resourceBindings.cbegin(), resourceBindings.cend()); - if (!shaderResourceBindings->create()) { - qCWarning(Backend) << "Unable to create resource bindings"; - return onFailure(); - } + if (!shaderResourceBindings->create()) + return onFailure("Unable to create resource bindings"); // Setup attributes const Geometry *geom = cmd.m_geometry.data(); @@ -955,10 +949,8 @@ void Renderer::buildGraphicsPipelines(RHIGraphicsPipeline *graphicsPipeline, if (!prepareGeometryInputBindings(geom, cmd.m_rhiShader, inputBindings, rhiAttributes, - attributeNameToBinding)) { - qCWarning(Backend) << "Geometry doesn't match expected layout"; - return onFailure(); - } + attributeNameToBinding)) + return onFailure("Geometry doesn't match expected layout"); // Create pipeline QRhiGraphicsPipeline *pipeline = m_submissionContext->rhi()->newGraphicsPipeline(); @@ -1038,10 +1030,10 @@ void Renderer::buildGraphicsPipelines(RHIGraphicsPipeline *graphicsPipeline, // Setup potential texture render target const bool renderTargetIsSet = setupRenderTarget(rv, graphicsPipeline, rhiSwapChain); if (!renderTargetIsSet) - return onFailure(); + return onFailure("No Render Target Set"); if (!pipeline->create()) - return onFailure(); + return onFailure("Creation Failed"); graphicsPipeline->markComplete(); } @@ -1145,16 +1137,6 @@ void Renderer::createRenderTarget(RenderTarget *target) Q_ASSERT(!m_RHIResourceManagers->rhiRenderTargetManager()->contains(renderTargetId)); RHIRenderTarget *rhiTarget = rhiRenderTargetManager->getOrCreateResource(renderTargetId); - // Used in case of failure - QVarLengthArray<QRhiResource*> resourcesToClean; - auto cleanAllocatedResources = [&] { - qCWarning(Backend) << "Failed to create RenderTarget"; - for (auto res : resourcesToClean) { - res->destroy(); - delete res; - } - }; - RHITextureManager *texman = rhiResourceManagers()->rhiTextureManager(); // TO DO: We use all render targets and ignore the fact that // QRenderTargetSelector can specify a subset of outputs @@ -1169,6 +1151,34 @@ void Renderer::createRenderTarget(RenderTarget *target) bool hasDepthTexture = false; + // Used in case of failure + QVarLengthArray<QRhiResource*> resourcesToClean; + auto cleanAllocatedResources = [&] { + QStringList descDetails; + auto texDetails = [](QRhiTexture *tex) { + return QString("Texture format: %1; flags: %2; samples: %3").arg(tex->format()).arg(tex->flags()).arg(tex->sampleCount()); + }; + auto bufferDetails = [](QRhiRenderBuffer* buffer) { + return QString("Buffer Type: %1; flags: %2; samples: %3").arg(buffer->type()).arg(buffer->flags()).arg(buffer->sampleCount()); + }; + const auto itEnd = desc.cendColorAttachments(); + for (auto it = desc.cbeginColorAttachments(); it != itEnd; ++it) { + QString attDetails = QString("Layer: %1; Level: %2; ").arg(it->layer()).arg(it->level()); + if (it->texture()) + attDetails += texDetails(it->texture()); + descDetails << attDetails; + } + if (desc.depthTexture()) + descDetails << QString("Depth Texture: %1").arg(texDetails(desc.depthTexture())); + if (desc.depthStencilBuffer()) + descDetails << QString("Depth Buffer: %1").arg(bufferDetails(desc.depthStencilBuffer())); + qCWarning(Backend) << "Failed to create RenderTarget" << renderTargetId << "\n" << descDetails; + for (auto res : resourcesToClean) { + res->destroy(); + delete res; + } + }; + // Look up attachments to populate the RT description // Attachments are sorted by attachment point (Color0 is first) for (const Attachment &attachment : pack.attachments()) { @@ -1221,14 +1231,14 @@ void Renderer::createRenderTarget(RenderTarget *target) // Potentially create a depth & stencil renderbuffer QRhiRenderBuffer *ds{}; if (!hasDepthTexture) { - ds = m_submissionContext->rhi()->newRenderBuffer(QRhiRenderBuffer::DepthStencil, targetSize, targetSamples); - resourcesToClean << ds; + ds = m_submissionContext->rhi()->newRenderBuffer(QRhiRenderBuffer::DepthStencil, targetSize, targetSamples); + resourcesToClean << ds; - if (!ds->create()) { - cleanAllocatedResources(); - return; - } - desc.setDepthStencilBuffer(ds); + if (!ds->create()) { + cleanAllocatedResources(); + return; + } + desc.setDepthStencilBuffer(ds); } // Create the render target @@ -1266,10 +1276,9 @@ bool Renderer::setupRenderTarget(RenderView *rv, const Qt3DCore::QNodeId &renderTargetId = renderTarget->peerId(); RHIRenderTargetManager *rhiRenderTargetManager = m_RHIResourceManagers->rhiRenderTargetManager(); RHIRenderTarget *rhiTarget = rhiRenderTargetManager->lookupResource(renderTargetId); - Q_ASSERT(rhiTarget); - if (!rhiTarget->renderTarget) { - qWarning(Backend) << "Invalid RenderTarget for Pipeline"; + if (!rhiTarget || !rhiTarget->renderTarget) { + qWarning(Backend) << "Invalid RenderTarget " << renderTargetId << " for Pipeline"; return false; } @@ -1921,9 +1930,6 @@ void Renderer::updateResources() } } - - - // Record list of buffer that might need uploading lookForDownloadableBuffers(); } |