diff --git a/driver/pipeline.c b/driver/pipeline.c index 05a7e7e..58affd6 100644 --- a/driver/pipeline.c +++ b/driver/pipeline.c @@ -57,130 +57,189 @@ void patchShaderDepthStencilBlending(uint64_t** instructions, uint32_t* size, co } + //TODO account for MSAA state! //TODO patch blending //TODO optimise - /// patch shader so that r0 will contain whatever would be written to tlb_color_all - /// r0 contains sRGBA - //"sig_none ; r0 = or.always(a, a, uni, nop) ; nop = nop(r0, r0) ;" + if(bas->blendEnable) + { + /// patch shader so that r0 will contain whatever would be written to tlb_color_all + /// r0 contains sRGBA + //"sig_none ; r0 = or.always(a, a, uni, nop) ; nop = nop(r0, r0) ;" - /// load dRGBA to r1 - /// load tbl color dRGBA to r4 - //"sig_color_load ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" - //"sig_none ; nop = nop(r0, r0) ; r1 = v8min.always(r4, r4) ;" + /// load dRGBA to r1 + /// load tbl color dRGBA to r4 + //"sig_color_load ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" + //"sig_none ; nop = nop(r0, r0) ; r1 = v8min.always(r4, r4) ;" + + //if factors are not separate + if(bas->srcAlphaBlendFactor == bas->srcColorBlendFactor && + bas->dstAlphaBlendFactor == bas->dstColorBlendFactor) + { + switch(bas->srcAlphaBlendFactor) + { + case VK_BLEND_FACTOR_ZERO: + /// if Sfactor is ZERO + //"sig_small_imm ; r2 = or.always(b, b, nop, 0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE: + /// if Sfactor is ONE + //"sig_small_imm ; r2 = or.always(b, b, nop, -1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_SRC_COLOR: + /// if Sfactor is sCOLOR + //"sig_none ; r2 = or.always(r0, r0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: + /// if Sfactor is 1-sCOLOR + //"sig_none ; r2 = not.always(r0, r0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_DST_COLOR: + /// if Sfactor is dCOLOR + //"sig_none ; r2 = or.always(r1, r1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR: + /// if Sfactor is 1-dCOLOR + //"sig_none ; r2 = not.always(r1, r1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_SRC_ALPHA: + /// if Sfactor is sALPHA + //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA: + /// if Sfactor is 1-sALPHA + //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" + //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" + case VK_BLEND_FACTOR_DST_ALPHA: + /// if Sfactor is dALPHA + //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA: + /// if Sfactor is 1-dALPHA + //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" + //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_CONSTANT_COLOR: + case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR: + case VK_BLEND_FACTOR_CONSTANT_ALPHA: + case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: + /// if Sfactor is cCOLOR, 1-cCOLOR, cALPHA, 1-cALPHA = 0xffffffff + //"sig_load_imm ; r2 = load32.always(0xffffffff) ; nop = load32() ;" + break; + case VK_BLEND_FACTOR_SRC_ALPHA_SATURATE: + /// if Sfactor is sALPHASat + //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" //sAAAA + //"sig_none ; r3.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" //dAAAA + //"sig_none ; r3 = not.always(r3, r3) ; nop = nop(r0, r0) ;" //1-dAAAA + //"sig_none ; nop = nop(r0, r0) ; r2 = v8min.always(r2, r3) ;" //min(sAAAA, 1-dAAAA) + //"sig_load_imm ; r3 = load32.always(0xff000000) ; nop = load32() ;" //load alpha = 1 + //"sig_small_imm ; r2 = or.always(r2, r3) ; nop = nop(r0, r0) ;" //set alpha to 1 + break; + } + + /// Multiply sRGBA and source factor + //"sig_none ; nop = nop(r0, r0) ; r0 = v8muld.always(r0, r2) ;" - /// if Sfactor is ZERO - //"sig_small_imm ; r2 = or.always(b, b, nop, 0) ; nop = nop(r0, r0) ;" + switch(bas->dstAlphaBlendFactor) + { + case VK_BLEND_FACTOR_ZERO: + /// if Dfactor is ZERO + //"sig_small_imm ; r2 = or.always(b, b, nop, 0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE: + /// if Dfactor is ONE + //"sig_small_imm ; r2 = or.always(b, b, nop, -1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_SRC_COLOR: + /// if Dfactor is sCOLOR + //"sig_none ; r2 = or.always(r0, r0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: + /// if Dfactor is 1-sCOLOR + //"sig_none ; r2 = not.always(r0, r0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_DST_COLOR: + /// if Dfactor is dCOLOR + //"sig_none ; r2 = or.always(r1, r1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR: + /// if Dfactor is 1-dCOLOR + //"sig_none ; r2 = not.always(r1, r1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_SRC_ALPHA: + /// if Dfactor is sALPHA + //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA: + /// if Dfactor is 1-sALPHA + //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" + //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" + case VK_BLEND_FACTOR_DST_ALPHA: + /// if Dfactor is dALPHA + //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA: + /// if Dfactor is 1-dALPHA + //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" + //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" + break; + case VK_BLEND_FACTOR_CONSTANT_COLOR: + case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR: + case VK_BLEND_FACTOR_CONSTANT_ALPHA: + case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: + /// if Dfactor is cCOLOR, 1-cCOLOR, cALPHA, 1-cALPHA = 0xffffffff + //"sig_load_imm ; r2 = load32.always(0xffffffff) ; nop = load32() ;" + break; + case VK_BLEND_FACTOR_SRC_ALPHA_SATURATE: + /// if Dfactor is sALPHASat + //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" //sAAAA + //"sig_none ; r3.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" //dAAAA + //"sig_none ; r3 = not.always(r3, r3) ; nop = nop(r0, r0) ;" //1-dAAAA + //"sig_none ; nop = nop(r0, r0) ; r2 = v8min.always(r2, r3) ;" //min(sAAAA, 1-dAAAA) + //"sig_load_imm ; r3 = load32.always(0xff000000) ; nop = load32() ;" //load alpha = 1 + //"sig_small_imm ; r2 = or.always(r2, r3) ; nop = nop(r0, r0) ;" //set alpha to 1 + break; + } - /// if Sfactor is ONE - //"sig_small_imm ; r2 = or.always(b, b, nop, -1) ; nop = nop(r0, r0) ;" + /// Multiply dRGBA and destination factor + //"sig_none ; nop = nop(r0, r0) ; r1 = v8muld.always(r1, r2) ;" + } + else //separate factors + { + //TODO + } - /// if Sfactor is sCOLOR - //"sig_none ; r2 = or.always(r0, r0) ; nop = nop(r0, r0) ;" - - /// if Sfactor is 1-sCOLOR - //"sig_none ; r2 = not.always(r0, r0) ; nop = nop(r0, r0) ;" - - /// if Sfactor is dCOLOR - //"sig_none ; r2 = or.always(r1, r1) ; nop = nop(r0, r0) ;" - - /// if Sfactor is 1-dCOLOR - //"sig_none ; r2 = not.always(r1, r1) ; nop = nop(r0, r0) ;" - - /// if Sfactor is sALPHA - //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" - - /// if Sfactor is 1-sALPHA - //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" - //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" - - /// if Sfactor is dALPHA - //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" - - /// if Sfactor is 1-dALPHA - //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" - //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" - - /// if Sfactor is cCOLOR, 1-cCOLOR, cALPHA, 1-cALPHA = 0xffffffff - //"sig_load_imm ; r2 = load32.always(0xffffffff) ; nop = load32() ;" - - /// if Sfactor is sALPHASat - //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" //sAAAA - //"sig_none ; r3.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" //dAAAA - //"sig_none ; r3 = not.always(r3, r3) ; nop = nop(r0, r0) ;" //1-dAAAA - //"sig_none ; nop = nop(r0, r0) ; r2 = v8min.always(r2, r3) ;" //min(sAAAA, 1-dAAAA) - //"sig_load_imm ; r3 = load32.always(0xff000000) ; nop = load32() ;" //load alpha = 1 - //"sig_small_imm ; r2 = or.always(r2, r3) ; nop = nop(r0, r0) ;" //set alpha to 1 - - /// Multiply sRGBA and source factor - //"sig_none ; nop = nop(r0, r0) ; r0 = v8muld.always(r0, r2) ;" - - - - /// if Dfactor is ZERO - //"sig_small_imm ; r2 = or.always(b, b, nop, 0) ; nop = nop(r0, r0) ;" - - /// if Dfactor is ONE - //"sig_small_imm ; r2 = or.always(b, b, nop, -1) ; nop = nop(r0, r0) ;" - - /// if Dfactor is sCOLOR - //"sig_none ; r2 = or.always(r0, r0) ; nop = nop(r0, r0) ;" - - /// if Dfactor is 1-sCOLOR - //"sig_none ; r2 = not.always(r0, r0) ; nop = nop(r0, r0) ;" - - /// if Dfactor is dCOLOR - //"sig_none ; r2 = or.always(r1, r1) ; nop = nop(r0, r0) ;" - - /// if Dfactor is 1-dCOLOR - //"sig_none ; r2 = not.always(r1, r1) ; nop = nop(r0, r0) ;" - - /// if Dfactor is sALPHA - //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" - - /// if Dfactor is 1-sALPHA - //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" - //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" - - /// if Dfactor is dALPHA - //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" - - /// if Dfactor is 1-dALPHA - //"sig_none ; r2.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" - //"sig_none ; r2 = not.always(r2, r2) ; nop = nop(r0, r0) ;" - - /// if Dfactor is cCOLOR, 1-cCOLOR, cALPHA, 1-cALPHA = 0xffffffff - //"sig_load_imm ; r2 = load32.always(0xffffffff) ; nop = load32() ;" - - /// if Dfactor is sALPHASat - //"sig_none ; r2.8888 = or.always.8d(r0, r0) ; nop = nop(r0, r0) ;" //sAAAA - //"sig_none ; r3.8888 = or.always.8d(r1, r1) ; nop = nop(r0, r0) ;" //dAAAA - //"sig_none ; r3 = not.always(r3, r3) ; nop = nop(r0, r0) ;" //1-dAAAA - //"sig_none ; nop = nop(r0, r0) ; r2 = v8min.always(r2, r3) ;" //min(sAAAA, 1-dAAAA) - //"sig_load_imm ; r3 = load32.always(0xff000000) ; nop = load32() ;" //load alpha = 1 - //"sig_small_imm ; r2 = or.always(r2, r3) ; nop = nop(r0, r0) ;" //set alpha to 1 - - /// Multiply dRGBA and destination factor - //"sig_none ; nop = nop(r0, r0) ; r1 = v8muld.always(r1, r2) ;" - - - - /// If Equation is ADD: - //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8adds.always(r0, r1) ;" - - /// If Equation is SUB: - //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8subs.always(r0, r1) ;" - - /// If Equation is rSUB: - //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8subs.always(r1, r0) ;" - - /// retain nops etc. - //"sig_end ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" - //"sig_none ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" - //"sig_unlock_score ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" + switch(bas->alphaBlendOp) + { + case VK_BLEND_OP_ADD: + /// If Equation is ADD: + //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8adds.always(r0, r1) ;" + break; + case VK_BLEND_OP_SUBTRACT: + /// If Equation is SUB: + //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8subs.always(r0, r1) ;" + break; + case VK_BLEND_OP_REVERSE_SUBTRACT: + /// If Equation is rSUB: + //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8subs.always(r1, r0) ;" + break; + case VK_BLEND_OP_MIN: + /// If Equation is MIN: + //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8min.always(r0, r1) ;" + break; + case VK_BLEND_OP_MAX: + /// If Equation is MAX: + //"sig_none ; nop = nop(r0, r0) ; tlb_color_all = v8max.always(r0, r1) ;" + break; + } + /// retain nops etc. + //"sig_end ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" + //"sig_none ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" + //"sig_unlock_score ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;" + } //replace instructions pointer FREE(*instructions);