Start untangling sw::Context from the rendering code Remove sw::Context members from the processor classes and removed many related functions. Also, the Renderer::draw() function now takes a const sw::Context object in, so it is no longer legal to modify sw::Context object within the Renderer::draw() function. Bug b/132280877 Change-Id: I890b5ba7db2306c02a96ec3e10496aa35c51bbe2 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30950 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Device/Context.cpp b/src/Device/Context.cpp index ce4fc3e..b2d6734 100644 --- a/src/Device/Context.cpp +++ b/src/Device/Context.cpp
@@ -242,29 +242,29 @@ return modified; } - bool Context::depthWriteActive() + bool Context::depthWriteActive() const { if(!depthBufferActive()) return false; return depthWriteEnable; } - bool Context::alphaTestActive() + bool Context::alphaTestActive() const { return transparencyAntialiasing != TRANSPARENCY_NONE; } - bool Context::depthBufferActive() + bool Context::depthBufferActive() const { return depthBuffer && depthBufferEnable; } - bool Context::stencilActive() + bool Context::stencilActive() const { return stencilBuffer && stencilEnable; } - bool Context::alphaBlendActive() + bool Context::alphaBlendActive() const { if(!alphaBlendEnable) { @@ -282,7 +282,7 @@ return colorBlend || alphaBlend; } - VkBlendFactor Context::sourceBlendFactor() + VkBlendFactor Context::sourceBlendFactor() const { if(!alphaBlendEnable) return VK_BLEND_FACTOR_ONE; @@ -303,7 +303,7 @@ return sourceBlendFactorState; } - VkBlendFactor Context::destBlendFactor() + VkBlendFactor Context::destBlendFactor() const { if(!alphaBlendEnable) return VK_BLEND_FACTOR_ONE; @@ -324,7 +324,7 @@ return destBlendFactorState; } - VkBlendOp Context::blendOperation() + VkBlendOp Context::blendOperation() const { if(!alphaBlendEnable) return VK_BLEND_OP_SRC_EXT; @@ -436,7 +436,7 @@ return blendOperationState; } - VkBlendFactor Context::sourceBlendFactorAlpha() + VkBlendFactor Context::sourceBlendFactorAlpha() const { if(!separateAlphaBlendEnable) { @@ -462,7 +462,7 @@ } } - VkBlendFactor Context::destBlendFactorAlpha() + VkBlendFactor Context::destBlendFactorAlpha() const { if(!separateAlphaBlendEnable) { @@ -488,7 +488,7 @@ } } - VkBlendOp Context::blendOperationAlpha() + VkBlendOp Context::blendOperationAlpha() const { if(!separateAlphaBlendEnable) { @@ -605,7 +605,7 @@ } } - bool Context::perspectiveActive() + bool Context::perspectiveActive() const { if(!colorUsed()) { @@ -625,7 +625,7 @@ return true; } - VkFormat Context::renderTargetInternalFormat(int index) + VkFormat Context::renderTargetInternalFormat(int index) const { if(renderTarget[index]) { @@ -637,7 +637,7 @@ } } - bool Context::colorWriteActive() + bool Context::colorWriteActive() const { for (int i = 0; i < RENDERTARGETS; i++) { @@ -650,7 +650,7 @@ return false; } - int Context::colorWriteActive(int index) + int Context::colorWriteActive(int index) const { if(!renderTarget[index] || renderTarget[index]->getFormat() == VK_FORMAT_UNDEFINED) { @@ -666,7 +666,7 @@ return colorWriteMask[index]; } - bool Context::colorUsed() + bool Context::colorUsed() const { return colorWriteActive() || alphaTestActive() || (pixelShader && pixelShader->getModes().ContainsKill); }
diff --git a/src/Device/Context.hpp b/src/Device/Context.hpp index 7700440..6e9408e 100644 --- a/src/Device/Context.hpp +++ b/src/Device/Context.hpp
@@ -116,21 +116,21 @@ bool setColorWriteMask(int index, int colorWriteMask); bool setWriteSRGB(bool sRGB); - bool depthWriteActive(); - bool alphaTestActive(); - bool depthBufferActive(); - bool stencilActive(); + bool depthWriteActive() const; + bool alphaTestActive() const; + bool depthBufferActive() const; + bool stencilActive() const; - bool perspectiveActive(); + bool perspectiveActive() const; - bool alphaBlendActive(); - VkBlendFactor sourceBlendFactor(); - VkBlendFactor destBlendFactor(); - VkBlendOp blendOperation(); + bool alphaBlendActive() const; + VkBlendFactor sourceBlendFactor() const; + VkBlendFactor destBlendFactor() const; + VkBlendOp blendOperation() const; - VkBlendFactor sourceBlendFactorAlpha(); - VkBlendFactor destBlendFactorAlpha(); - VkBlendOp blendOperationAlpha(); + VkBlendFactor sourceBlendFactorAlpha() const; + VkBlendFactor destBlendFactorAlpha() const; + VkBlendOp blendOperationAlpha() const; VkPrimitiveTopology topology; @@ -146,10 +146,10 @@ float depthBias; float slopeDepthBias; - VkFormat renderTargetInternalFormat(int index); - bool colorWriteActive(); - int colorWriteActive(int index); - bool colorUsed(); + VkFormat renderTargetInternalFormat(int index) const; + bool colorWriteActive() const; + int colorWriteActive(int index) const; + bool colorUsed() const; vk::DescriptorSet::Bindings descriptorSets = {}; vk::DescriptorSet::DynamicOffsets descriptorDynamicOffsets = {};
diff --git a/src/Device/PixelProcessor.cpp b/src/Device/PixelProcessor.cpp index 073b40e..71ec36f 100644 --- a/src/Device/PixelProcessor.cpp +++ b/src/Device/PixelProcessor.cpp
@@ -57,7 +57,7 @@ return memcmp(static_cast<const States*>(this), static_cast<const States*>(&state), sizeof(States)) == 0; } - PixelProcessor::PixelProcessor(Context *context) : context(context) + PixelProcessor::PixelProcessor() { routineCache = nullptr; setRoutineCacheSize(1024); @@ -69,47 +69,6 @@ routineCache = nullptr; } - void PixelProcessor::setRenderTarget(int index, vk::ImageView* renderTarget) - { - context->renderTarget[index] = renderTarget; - } - - void PixelProcessor::setDepthBuffer(vk::ImageView *depthBuffer) - { - context->depthBuffer = depthBuffer; - } - - void PixelProcessor::setStencilBuffer(vk::ImageView *stencilBuffer) - { - context->stencilBuffer = stencilBuffer; - } - - void PixelProcessor::setDepthBufferEnable(bool depthBufferEnable) - { - context->setDepthBufferEnable(depthBufferEnable); - } - - void PixelProcessor::setDepthCompare(VkCompareOp depthCompareMode) - { - context->depthCompareMode = depthCompareMode; - } - - void PixelProcessor::setDepthWriteEnable(bool depthWriteEnable) - { - context->depthWriteEnable = depthWriteEnable; - } - - void PixelProcessor::setCullMode(CullMode cullMode, bool frontFacingCCW) - { - context->cullMode = cullMode; - context->frontFacingCCW = frontFacingCCW; - } - - void PixelProcessor::setColorWriteMask(int index, int rgbaMask) - { - context->setColorWriteMask(index, rgbaMask); - } - void PixelProcessor::setBlendConstant(const Color<float> &blendConstant) { // FIXME: Compact into generic function // FIXME: Clamp @@ -205,63 +164,18 @@ factor.invBlendConstant4F[3][3] = 1 - blendConstant.a; } - void PixelProcessor::setAlphaBlendEnable(bool alphaBlendEnable) - { - context->setAlphaBlendEnable(alphaBlendEnable); - } - - void PixelProcessor::setSourceBlendFactor(VkBlendFactor sourceBlendFactor) - { - context->setSourceBlendFactor(sourceBlendFactor); - } - - void PixelProcessor::setDestBlendFactor(VkBlendFactor destBlendFactor) - { - context->setDestBlendFactor(destBlendFactor); - } - - void PixelProcessor::setBlendOperation(VkBlendOp blendOperation) - { - context->setBlendOperation(blendOperation); - } - - void PixelProcessor::setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable) - { - context->setSeparateAlphaBlendEnable(separateAlphaBlendEnable); - } - - void PixelProcessor::setSourceBlendFactorAlpha(VkBlendFactor sourceBlendFactorAlpha) - { - context->setSourceBlendFactorAlpha(sourceBlendFactorAlpha); - } - - void PixelProcessor::setDestBlendFactorAlpha(VkBlendFactor destBlendFactorAlpha) - { - context->setDestBlendFactorAlpha(destBlendFactorAlpha); - } - - void PixelProcessor::setBlendOperationAlpha(VkBlendOp blendOperationAlpha) - { - context->setBlendOperationAlpha(blendOperationAlpha); - } - void PixelProcessor::setPerspectiveCorrection(bool perspectiveEnable) { perspectiveCorrection = perspectiveEnable; } - void PixelProcessor::setOcclusionEnabled(bool enable) - { - context->occlusionEnabled = enable; - } - void PixelProcessor::setRoutineCacheSize(int cacheSize) { delete routineCache; routineCache = new RoutineCache<State>(clamp(cacheSize, 1, 65536)); } - const PixelProcessor::State PixelProcessor::update() const + const PixelProcessor::State PixelProcessor::update(const Context* context) const { State state; @@ -330,13 +244,16 @@ return state; } - Routine *PixelProcessor::routine(const State &state) + Routine *PixelProcessor::routine(const State &state, + vk::PipelineLayout const *pipelineLayout, + SpirvShader const *pixelShader, + const vk::DescriptorSet::Bindings &descriptorSets) { Routine *routine = routineCache->query(state); if(!routine) { - QuadRasterizer *generator = new PixelProgram(state, context->pipelineLayout, context->pixelShader, context->descriptorSets); + QuadRasterizer *generator = new PixelProgram(state, pipelineLayout, pixelShader, descriptorSets); generator->generate(); routine = (*generator)("PixelRoutine_%0.8X", state.shaderID); delete generator;
diff --git a/src/Device/PixelProcessor.hpp b/src/Device/PixelProcessor.hpp index cf0eb5e..14d88d3 100644 --- a/src/Device/PixelProcessor.hpp +++ b/src/Device/PixelProcessor.hpp
@@ -120,47 +120,24 @@ public: typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw); - PixelProcessor(Context *context); + PixelProcessor(); virtual ~PixelProcessor(); - void setRenderTarget(int index, vk::ImageView *renderTarget); - void setDepthBuffer(vk::ImageView *depthBuffer); - void setStencilBuffer(vk::ImageView *stencilBuffer); - - void setDepthBufferEnable(bool depthBufferEnable); - void setDepthCompare(VkCompareOp depthCompareMode); - void setDepthWriteEnable(bool depthWriteEnable); - void setCullMode(CullMode cullMode, bool frontFacingCCW); - void setColorWriteMask(int index, int rgbaMask); - void setBlendConstant(const Color<float> &blendConstant); - void setAlphaBlendEnable(bool alphaBlendEnable); - void setSourceBlendFactor(VkBlendFactor sourceBlendFactor); - void setDestBlendFactor(VkBlendFactor destBlendFactor); - void setBlendOperation(VkBlendOp blendOperation); - - void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); - void setSourceBlendFactorAlpha(VkBlendFactor sourceBlendFactorAlpha); - void setDestBlendFactorAlpha(VkBlendFactor destBlendFactorAlpha); - void setBlendOperationAlpha(VkBlendOp blendOperationAlpha); - void setPerspectiveCorrection(bool perspectiveCorrection); - void setOcclusionEnabled(bool enable); - protected: - const State update() const; - Routine *routine(const State &state); + const State update(const Context* context) const; + Routine *routine(const State &state, vk::PipelineLayout const *pipelineLayout, + SpirvShader const *pixelShader, const vk::DescriptorSet::Bindings &descriptorSets); void setRoutineCacheSize(int routineCacheSize); // Other semi-constants Factor factor; private: - Context *const context; - RoutineCache<State> *routineCache; }; }
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp index 9c602e0..3a5a02f 100644 --- a/src/Device/Renderer.cpp +++ b/src/Device/Renderer.cpp
@@ -199,13 +199,11 @@ deallocate(data); } - Renderer::Renderer(Context *context, Conventions conventions, bool exactColorRounding) : VertexProcessor(context), PixelProcessor(context), SetupProcessor(context), context(context), viewport() + Renderer::Renderer(Conventions conventions, bool exactColorRounding) { setGlobalRenderingSettings(conventions, exactColorRounding); - setRenderTarget(0, nullptr); clipper = new Clipper; - blitter = new Blitter; #if PERF_HUD resetTimers(); @@ -269,9 +267,6 @@ delete clipper; clipper = nullptr; - delete blitter; - blitter = nullptr; - delete resumeApp; resumeApp = nullptr; @@ -297,7 +292,20 @@ sw::deallocate(mem); } - void Renderer::draw(VkPrimitiveTopology topology, VkIndexType indexType, unsigned int count, int baseVertex, vk::Fence* fence, bool update) + bool Renderer::hasQueryOfType(VkQueryType type) const + { + for(auto query : queries) + { + if(query->type == type) + { + return true; + } + } + + return false; + } + + void Renderer::draw(const sw::Context* context, VkIndexType indexType, unsigned int count, int baseVertex, vk::Fence* fence, bool update) { #ifndef NDEBUG if(count < minPrimitives || count > maxPrimitives) @@ -306,39 +314,26 @@ } #endif - context->topology = topology; - updateConfiguration(); int ms = context->sampleCount; - context->multiSampleMask = context->sampleMask & ((unsigned)0xFFFFFFFF >> (32 - ms)); if(!context->multiSampleMask) { return; } - context->occlusionEnabled = false; - for(auto query : queries) - { - if(query->type == VK_QUERY_TYPE_OCCLUSION) - { - context->occlusionEnabled = true; - break; - } - } - sync->lock(sw::PRIVATE); if(update) { - vertexState = VertexProcessor::update(topology); - setupState = SetupProcessor::update(); - pixelState = PixelProcessor::update(); + vertexState = VertexProcessor::update(context); + setupState = SetupProcessor::update(context); + pixelState = PixelProcessor::update(context); - vertexRoutine = VertexProcessor::routine(vertexState); + vertexRoutine = VertexProcessor::routine(vertexState, context->pipelineLayout, context->vertexShader, context->descriptorSets); setupRoutine = SetupProcessor::routine(setupState); - pixelRoutine = PixelProcessor::routine(pixelState); + pixelRoutine = PixelProcessor::routine(pixelState, context->pipelineLayout, context->pixelShader, context->descriptorSets); } int batch = batchSize / ms; @@ -392,7 +387,7 @@ } } - draw->topology = topology; + draw->topology = context->topology; draw->indexType = indexType; draw->batchSize = batch; @@ -1396,46 +1391,6 @@ } } - void Renderer::setMultiSampleMask(unsigned int mask) - { - context->sampleMask = mask; - } - - void Renderer::setTransparencyAntialiasing(TransparencyAntialiasing transparencyAntialiasing) - { - sw::transparencyAntialiasing = transparencyAntialiasing; - } - - void Renderer::setLineWidth(float width) - { - context->lineWidth = width; - } - - void Renderer::setDepthBias(float bias) - { - context->depthBias = bias; - } - - void Renderer::setSlopeDepthBias(float slopeBias) - { - context->slopeDepthBias = slopeBias; - } - - void Renderer::setRasterizerDiscard(bool rasterizerDiscard) - { - context->rasterizerDiscard = rasterizerDiscard; - } - - void Renderer::setPixelShader(const SpirvShader *shader) - { - context->pixelShader = shader; - } - - void Renderer::setVertexShader(const SpirvShader *shader) - { - context->vertexShader = shader; - } - void Renderer::addQuery(vk::Query *query) { queries.push_back(query); @@ -1446,11 +1401,11 @@ queries.remove(query); } - void Renderer::advanceInstanceAttributes() + void Renderer::advanceInstanceAttributes(Stream* inputs) { for(uint32_t i = 0; i < vk::MAX_VERTEX_INPUT_BINDINGS; i++) { - auto &attrib = context->input[i]; + auto &attrib = inputs[i]; if (attrib.count && attrib.instanceStride) { // Under the casts: attrib.buffer += attrib.instanceStride @@ -1491,11 +1446,6 @@ } #endif - void Renderer::setContext(const sw::Context& context) - { - *(this->context) = context; - } - void Renderer::setViewport(const VkViewport &viewport) { this->viewport = viewport;
diff --git a/src/Device/Renderer.hpp b/src/Device/Renderer.hpp index 86d6ad1..2c8c3be 100644 --- a/src/Device/Renderer.hpp +++ b/src/Device/Renderer.hpp
@@ -193,30 +193,16 @@ }; public: - Renderer(Context *context, Conventions conventions, bool exactColorRounding); + Renderer(Conventions conventions, bool exactColorRounding); virtual ~Renderer(); void *operator new(size_t size); void operator delete(void * mem); - void draw(VkPrimitiveTopology topology, VkIndexType indexType, unsigned int count, int baseVertex, vk::Fence* fence, bool update = true); + bool hasQueryOfType(VkQueryType type) const; - void setContext(const sw::Context& context); - - void setMultiSampleMask(unsigned int mask); - void setTransparencyAntialiasing(TransparencyAntialiasing transparencyAntialiasing); - - void setLineWidth(float width); - - void setDepthBias(float bias); - void setSlopeDepthBias(float slopeBias); - - void setRasterizerDiscard(bool rasterizerDiscard); - - // Programmable pipelines - void setPixelShader(const SpirvShader *shader); - void setVertexShader(const SpirvShader *shader); + void draw(const sw::Context* context, VkIndexType indexType, unsigned int count, int baseVertex, vk::Fence* fence, bool update = true); // Viewport & Clipper void setViewport(const VkViewport &viewport); @@ -225,7 +211,7 @@ void addQuery(vk::Query *query); void removeQuery(vk::Query *query); - void advanceInstanceAttributes(); + void advanceInstanceAttributes(Stream* inputs); void synchronize(); @@ -262,9 +248,7 @@ void initializeThreads(); void terminateThreads(); - Context *context; Clipper *clipper; - Blitter *blitter; VkViewport viewport; VkRect2D scissor; int clipFlags;
diff --git a/src/Device/SetupProcessor.cpp b/src/Device/SetupProcessor.cpp index 7af4d3a..eb5a7e5 100644 --- a/src/Device/SetupProcessor.cpp +++ b/src/Device/SetupProcessor.cpp
@@ -57,7 +57,7 @@ return memcmp(static_cast<const States*>(this), static_cast<const States*>(&state), sizeof(States)) == 0; } - SetupProcessor::SetupProcessor(Context *context) : context(context) + SetupProcessor::SetupProcessor() { routineCache = nullptr; setRoutineCacheSize(1024); @@ -69,7 +69,7 @@ routineCache = nullptr; } - SetupProcessor::State SetupProcessor::update() const + SetupProcessor::State SetupProcessor::update(const sw::Context* context) const { State state;
diff --git a/src/Device/SetupProcessor.hpp b/src/Device/SetupProcessor.hpp index d5b40f6..de52927 100644 --- a/src/Device/SetupProcessor.hpp +++ b/src/Device/SetupProcessor.hpp
@@ -64,19 +64,17 @@ typedef bool (*RoutinePointer)(Primitive *primitive, const Triangle *triangle, const Polygon *polygon, const DrawData *draw); - SetupProcessor(Context *context); + SetupProcessor(); ~SetupProcessor(); protected: - State update() const; + State update(const sw::Context* context) const; Routine *routine(const State &state); void setRoutineCacheSize(int cacheSize); private: - Context *const context; - RoutineCache<State> *routineCache; }; }
diff --git a/src/Device/VertexProcessor.cpp b/src/Device/VertexProcessor.cpp index e5d0859..db62f62 100644 --- a/src/Device/VertexProcessor.cpp +++ b/src/Device/VertexProcessor.cpp
@@ -61,7 +61,7 @@ return memcmp(static_cast<const States*>(this), static_cast<const States*>(&state), sizeof(States)) == 0; } - VertexProcessor::VertexProcessor(Context *context) : context(context) + VertexProcessor::VertexProcessor() { routineCache = nullptr; setRoutineCacheSize(1024); @@ -73,37 +73,19 @@ routineCache = nullptr; } - void VertexProcessor::setInputStream(int index, const Stream &stream) - { - context->input[index] = stream; - } - - void VertexProcessor::resetInputStreams() - { - for(int i = 0; i < MAX_VERTEX_INPUTS; i++) - { - context->input[i].defaults(); - } - } - - void VertexProcessor::setInstanceID(int instanceID) - { - context->instanceID = instanceID; - } - void VertexProcessor::setRoutineCacheSize(int cacheSize) { delete routineCache; routineCache = new RoutineCache<State>(clamp(cacheSize, 1, 65536)); } - const VertexProcessor::State VertexProcessor::update(VkPrimitiveTopology topology) + const VertexProcessor::State VertexProcessor::update(const sw::Context* context) { State state; state.shaderID = context->vertexShader->getSerialID(); - switch(topology) + switch(context->topology) { case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: state.verticesPerPrimitive = 1; @@ -118,7 +100,7 @@ state.verticesPerPrimitive = 3; break; default: - UNIMPLEMENTED("topology %d", int(topology)); + UNIMPLEMENTED("topology %d", int(context->topology)); } for(int i = 0; i < MAX_VERTEX_INPUTS; i++) @@ -136,13 +118,16 @@ return state; } - Routine *VertexProcessor::routine(const State &state) + Routine *VertexProcessor::routine(const State &state, + vk::PipelineLayout const *pipelineLayout, + SpirvShader const *vertexShader, + const vk::DescriptorSet::Bindings &descriptorSets) { Routine *routine = routineCache->query(state); if(!routine) // Create one { - VertexRoutine *generator = new VertexProgram(state, context->pipelineLayout, context->vertexShader, context->descriptorSets); + VertexRoutine *generator = new VertexProgram(state, pipelineLayout, vertexShader, descriptorSets); generator->generate(); routine = (*generator)("VertexRoutine_%0.8X", state.shaderID); delete generator;
diff --git a/src/Device/VertexProcessor.hpp b/src/Device/VertexProcessor.hpp index dedcf97..b5d7353 100644 --- a/src/Device/VertexProcessor.hpp +++ b/src/Device/VertexProcessor.hpp
@@ -80,24 +80,18 @@ typedef void (*RoutinePointer)(Vertex *output, unsigned int *batch, VertexTask *vertexTask, DrawData *draw); - VertexProcessor(Context *context); + VertexProcessor(); virtual ~VertexProcessor(); - void setInputStream(int index, const Stream &stream); - void resetInputStreams(); - - void setInstanceID(int instanceID); - protected: - const State update(VkPrimitiveTopology topology); - Routine *routine(const State &state); + const State update(const sw::Context* context); + Routine *routine(const State &state, vk::PipelineLayout const *pipelineLayout, + SpirvShader const *vertexShader, const vk::DescriptorSet::Bindings &descriptorSets); void setRoutineCacheSize(int cacheSize); private: - Context *const context; - RoutineCache<State> *routineCache; }; }
diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp index bb34b9b..f161e9e 100644 --- a/src/Vulkan/VkCommandBuffer.cpp +++ b/src/Vulkan/VkCommandBuffer.cpp
@@ -417,7 +417,7 @@ } } -void CommandBuffer::ExecutionState::bindAttachments() +void CommandBuffer::ExecutionState::bindAttachments(sw::Context& context) { // Binds all the attachments for the current subpass // Ideally this would be performed by BeginRenderPass and NextSubpass, but @@ -429,8 +429,7 @@ auto attachmentReference = renderPass->getCurrentSubpass().pColorAttachments[i]; if (attachmentReference.attachment != VK_ATTACHMENT_UNUSED) { - auto attachment = renderPassFramebuffer->getAttachment(attachmentReference.attachment); - renderer->setRenderTarget(i, attachment); + context.renderTarget[i] = renderPassFramebuffer->getAttachment(attachmentReference.attachment); } } @@ -440,11 +439,11 @@ auto attachment = renderPassFramebuffer->getAttachment(attachmentReference->attachment); if (attachment->hasDepthAspect()) { - renderer->setDepthBuffer(attachment); + context.depthBuffer = attachment; } if (attachment->hasStencilAspect()) { - renderer->setStencilBuffer(attachment); + context.stencilBuffer = attachment; } } } @@ -516,17 +515,17 @@ context.backStencil.reference = executionState.dynamicState.reference[1]; } - executionState.renderer->setContext(context); + executionState.bindAttachments(context); - executionState.bindAttachments(); + context.multiSampleMask = context.sampleMask & ((unsigned)0xFFFFFFFF >> (32 - context.sampleCount)); + context.occlusionEnabled = executionState.renderer->hasQueryOfType(VK_QUERY_TYPE_OCCLUSION); const uint32_t primitiveCount = pipeline->computePrimitiveCount(count); for(uint32_t instance = firstInstance; instance != firstInstance + instanceCount; instance++) { - executionState.renderer->setInstanceID(instance); - executionState.renderer->draw(context.topology, executionState.indexType, primitiveCount, vertexOffset, - executionState.fence); - executionState.renderer->advanceInstanceAttributes(); + context.instanceID = instance; + executionState.renderer->draw(&context, executionState.indexType, primitiveCount, vertexOffset, executionState.fence); + executionState.renderer->advanceInstanceAttributes(context.input); } } };
diff --git a/src/Vulkan/VkCommandBuffer.hpp b/src/Vulkan/VkCommandBuffer.hpp index f13ee23..40ea76f 100644 --- a/src/Vulkan/VkCommandBuffer.hpp +++ b/src/Vulkan/VkCommandBuffer.hpp
@@ -166,7 +166,7 @@ VertexInputBinding indexBufferBinding; VkIndexType indexType; - void bindAttachments(); + void bindAttachments(sw::Context& context); void bindVertexInputs(sw::Context& context, int firstVertex, int firstInstance); };
diff --git a/src/Vulkan/VkQueue.cpp b/src/Vulkan/VkQueue.cpp index db545d2..3f79c7f 100644 --- a/src/Vulkan/VkQueue.cpp +++ b/src/Vulkan/VkQueue.cpp
@@ -75,8 +75,7 @@ Queue::Queue() { - context.reset(new sw::Context()); - renderer.reset(new sw::Renderer(context.get(), sw::OpenGL, true)); + renderer.reset(new sw::Renderer(sw::OpenGL, true)); queueThread = std::thread(TaskLoop, this); } @@ -93,7 +92,6 @@ garbageCollect(); renderer.reset(nullptr); - context.reset(nullptr); } VkResult Queue::submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence)
diff --git a/src/Vulkan/VkQueue.hpp b/src/Vulkan/VkQueue.hpp index f9664b7..9dda990 100644 --- a/src/Vulkan/VkQueue.hpp +++ b/src/Vulkan/VkQueue.hpp
@@ -151,7 +151,6 @@ void garbageCollect(); void submitQueue(const Task& task); - std::unique_ptr<sw::Context> context; std::unique_ptr<sw::Renderer> renderer; Chan<Task> pending; Chan<VkSubmitInfo*> toDelete;