diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.cpp b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.cpp index 9ebfffb6..71ec0cec 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.cpp @@ -71,7 +71,6 @@ namespace skyline::gpu::interconnect::maxwell3d { } } - static u8 ConvertCompareFunc(engine::CompareFunc func) { if (func < engine::CompareFunc::D3DNever || func > engine::CompareFunc::OglAlways || (func > engine::CompareFunc::D3DAlways && func < engine::CompareFunc::OglNever)) throw exception("Invalid comparision function: 0x{:X}", static_cast(func)); @@ -253,12 +252,12 @@ namespace skyline::gpu::interconnect::maxwell3d { static PackedPipelineState::AttachmentBlendState PackAttachmentBlendState(bool enable, engine::CtWrite writeMask, auto blend) { return { .colorWriteMask = ConvertColorWriteMask(writeMask), - .colorBlendOp = ConvertBlendOp(blend.colorOp), - .srcColorBlendFactor = ConvertBlendFactor(blend.colorSourceCoeff), - .dstColorBlendFactor = ConvertBlendFactor(blend.colorDestCoeff), - .alphaBlendOp = ConvertBlendOp(blend.alphaOp), - .srcAlphaBlendFactor = ConvertBlendFactor(blend.alphaSourceCoeff), - .dstAlphaBlendFactor = ConvertBlendFactor(blend.alphaDestCoeff), + .colorBlendOp = enable ? ConvertBlendOp(blend.colorOp) : u8{0}, + .srcColorBlendFactor = enable ? ConvertBlendFactor(blend.colorSourceCoeff) : u8{0}, + .dstColorBlendFactor = enable ? ConvertBlendFactor(blend.colorDestCoeff) : u8{0}, + .alphaBlendOp = enable ? ConvertBlendOp(blend.alphaOp) : u8{0}, + .srcAlphaBlendFactor = enable ? ConvertBlendFactor(blend.alphaSourceCoeff) : u8{0}, + .dstAlphaBlendFactor = enable ? ConvertBlendFactor(blend.alphaDestCoeff) : u8{0}, .blendEnable = enable }; } diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.h index 76cb08f6..13cd76b2 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/packed_pipeline_state.h @@ -59,6 +59,7 @@ namespace skyline::gpu::interconnect::maxwell3d { float pointSize; std::array vertexAttributes; std::array colorRenderTargetFormats; //!< Use {Set, Get}ColorRenderTargetFormat + std::bitset<8> activeColorTargets; std::array postVtgShaderAttributeSkipMask; struct VertexBinding { diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp index 4f54f7ad..4107feba 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp @@ -439,8 +439,17 @@ namespace skyline::gpu::interconnect::maxwell3d { packedState.SetLogicOp(engine->logicOp.func); for (u32 i{}; i < engine::ColorTargetCount; i++) { - auto ctWrite{engine->singleCtWriteControl ? engine->ctWrites[0] : engine->ctWrites[i]}; - bool enable{engine->blend.enable[i] != 0}; + auto ctWrite{[&]() { + if (!packedState.activeColorTargets.test(i)) + return engine::CtWrite{}; + + if (engine->singleCtWriteControl) + return engine->ctWrites[0]; + else + return engine->ctWrites[i]; + }()}; + + bool enable{engine->blend.enable[i] != 0 && packedState.activeColorTargets.test(i)}; if (engine->blendStatePerTargetEnable) packedState.SetAttachmentBlendState(i, enable, ctWrite, engine->blendPerTargets[i]); @@ -502,9 +511,11 @@ namespace skyline::gpu::interconnect::maxwell3d { } colorAttachments.clear(); + packedState.activeColorTargets.reset(); for (size_t i{}; i < ctSelect.count; i++) { const auto &view{colorRenderTargets[ctSelect[i]].UpdateGet(ctx, packedState).view.get()}; colorAttachments.push_back(view); + packedState.activeColorTargets.set(i); if (view) ctx.executor.AttachTexture(view);