diff options
Diffstat (limited to 'src/runtime/dragon/dragonrenderer.cpp')
-rw-r--r-- | src/runtime/dragon/dragonrenderer.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/runtime/dragon/dragonrenderer.cpp b/src/runtime/dragon/dragonrenderer.cpp index afe93db..826f04f 100644 --- a/src/runtime/dragon/dragonrenderer.cpp +++ b/src/runtime/dragon/dragonrenderer.cpp @@ -357,12 +357,18 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame) Immutable<RenderView> renderView; }; + QVector<QNodeId> texturesUsedInRenderTargets; QHash<QSurface *, QVector<SurfaceInfo>> surfaceViews; // ordered for (const auto &leafNodeId : leafNodes) { // TODO IMPORTANT make sure the views are ordered correctly regardless of surface differences const auto &renderView = renderViews[leafNodeId]; SurfaceInfo info { leafNodeId, renderView }; surfaceViews[renderView->surface].push_back(info); + + // We need a list of texture IDs that are used in render targets and hence cannot be shared + for (const auto &renderTarget : renderView->attachmentPack.outputs) { + texturesUsedInRenderTargets.push_back(renderTarget->textureUuid); + } } bool preparationsComplete = false; @@ -403,7 +409,13 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame) return Mutable<GLTexture>(createGlTexture(loadedTexture, activeSurface.openGLContext())); }; - auto compareGLTexture = [](const GLTexture &glTexture, const Immutable<LoadedTexture> &loaded){ + auto compareGLTexture = [texturesUsedInRenderTargets](const GLTexture &glTexture, const Immutable<LoadedTexture> &loaded){ + // If a texture is used in a render target, it cannot share GLTexture with other textures + // TODO Consider separating the concept of any texture and one that is being rendered to, at least on the backend + if (texturesUsedInRenderTargets.contains(glTexture.loadedTexture->texture->peerId()) + || texturesUsedInRenderTargets.contains(loaded->texture->peerId())) + return false; + return glTexture.loadedTexture == loaded; }; |