From f1473ba1fb08a9c06afc53c4d700f8cc26a3b89f Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 6 Aug 2013 16:01:31 +0800 Subject: [PATCH 1/6] Add remaining GE_LOGI in enum GELogicOp --- GPU/ge_constants.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/GPU/ge_constants.h b/GPU/ge_constants.h index de4b1fbd86..74194be217 100644 --- a/GPU/ge_constants.h +++ b/GPU/ge_constants.h @@ -464,10 +464,22 @@ enum GEPrimitiveType enum GELogicOp { - GE_LOGIC_AND = 1, - GE_LOGIC_XOR = 6, - GE_LOGIC_INVERT = 10, - GE_LOGIC_DRAWINVERTED = 12, + GE_LOGIC_CLEAR=0, + GE_LOGIC_AND=1, + GE_LOGIC_AND_REVERSE=2, + GE_LOGIC_COPY=3, + GE_LOGIC_AND_INVERTED=4, + GE_LOGIC_NOOP=5, + GE_LOGIC_XOR=6, + GE_LOGIC_OR=7, + GE_LOGIC_NOR=8, + GE_LOGIC_EQUIV=9, + GE_LOGIC_INVERTED=10, + GE_LOGIC_OR_REVERSE=11, + GE_LOGIC_COPY_INVERTED=12, + GE_LOGIC_OR_INVERTED=13, + GE_LOGIC_NAND=14, + GE_LOGIC_SET=15 }; enum GEPaletteFormat From 5c4af8908ef3e7458233b34f8da2f60c2a9835a5 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 6 Aug 2013 16:03:27 +0800 Subject: [PATCH 2/6] Add context for logicOps --- GPU/GLES/StateMapping.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 1b49abf87a..f14ebe9dcd 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -200,6 +200,19 @@ void TransformDrawEngine::ApplyDrawState(int prim) { glstate.blendEquation.set(eqLookup[blendFuncEq]); } + bool wantLogicOps = !gstate.isModeClear() && gstate.isLogicOpEnabled(); + glstate.colorLogicOp.set(wantLogicOps); + if(wantLogicOps) { + GLuint glLogicOp; + int opcode = gstate.getLogicOp(); + if (opcode == GE_LOGIC_CLEAR) + glLogicOp = GL_CLEAR; + else if (opcode == GE_LOGIC_AND) + glLogicOp = GL_AND; + //TODO + glstate.logicOp.set(glLogicOp); + } + // Set Dither if (gstate.isDitherEnabled()) { glstate.dither.enable(); From c9c1a75869f4414d5afca0a0eeb50bb6c50dbf25 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 6 Aug 2013 16:14:36 +0800 Subject: [PATCH 3/6] Fix opcode/glLogicOp type --- GPU/GLES/StateMapping.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index f14ebe9dcd..8dae5b06dc 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -92,6 +92,7 @@ static const GLushort stencilOps[] = { GL_KEEP, // reserved }; + static GLenum blendColor2Func(u32 fix) { if (fix == 0xFFFFFF) return GL_ONE; @@ -203,8 +204,8 @@ void TransformDrawEngine::ApplyDrawState(int prim) { bool wantLogicOps = !gstate.isModeClear() && gstate.isLogicOpEnabled(); glstate.colorLogicOp.set(wantLogicOps); if(wantLogicOps) { - GLuint glLogicOp; - int opcode = gstate.getLogicOp(); + GLushort glLogicOp; + GELogicOp opcode = gstate.getLogicOp(); if (opcode == GE_LOGIC_CLEAR) glLogicOp = GL_CLEAR; else if (opcode == GE_LOGIC_AND) From 6992eba90a6dcb0ae316d7321e07af568046560c Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 6 Aug 2013 16:25:33 +0800 Subject: [PATCH 4/6] Add remaining opcodes --- GPU/GLES/StateMapping.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 8dae5b06dc..19d5c03bde 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -210,7 +210,34 @@ void TransformDrawEngine::ApplyDrawState(int prim) { glLogicOp = GL_CLEAR; else if (opcode == GE_LOGIC_AND) glLogicOp = GL_AND; - //TODO + else if (opcode == GE_LOGIC_AND_REVERSE) + glLogicOp = GL_AND_REVERSE; + else if (opcode == GE_LOGIC_COPY) + glLogicOp = GL_COPY; + else if (opcode == GE_LOGIC_AND_INVERTED) + glLogicOp = GL_AND_INVERTED; + else if (opcode == GE_LOGIC_NOOP) + glLogicOp = GL_NOOP; + else if (opcode == GE_LOGIC_XOR) + glLogicOp = GL_XOR; + else if (opcode == GE_LOGIC_OR) + glLogicOp = GL_OR; + else if (opcode == GE_LOGIC_NOR) + glLogicOp = GL_NOR; + else if (opcode == GE_LOGIC_EQUIV) + glLogicOp = GL_EQUIV; + else if (opcode == GE_LOGIC_INVERTED) + glLogicOp = GL_INVERT; + else if (opcode == GE_LOGIC_OR_REVERSE) + glLogicOp = GL_OR_REVERSE; + else if (opcode == GE_LOGIC_COPY_INVERTED) + glLogicOp = GL_COPY_INVERTED; + else if (opcode == GE_LOGIC_OR_INVERTED) + glLogicOp = GL_OR_INVERTED; + else if (opcode == GE_LOGIC_NAND) + glLogicOp = GL_NAND; + else if (opcode == GE_LOGIC_SET) + glLogicOp = GL_SET; glstate.logicOp.set(glLogicOp); } From 1fb77f5fecb68511063a17d5fa807b2168d5a471 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 6 Aug 2013 16:30:58 +0800 Subject: [PATCH 5/6] Use lookup table --- GPU/GLES/StateMapping.cpp | 59 ++++++++++++++------------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 19d5c03bde..4d0f329898 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -92,6 +92,24 @@ static const GLushort stencilOps[] = { GL_KEEP, // reserved }; +static const GLushort logicOps[] = { + GL_CLEAR, + GL_SET, + GL_COPY, + GL_COPY_INVERTED, + GL_NOOP, + GL_INVERT, + GL_AND, + GL_NAND, + GL_OR, + GL_NOR, + GL_XOR, + GL_EQUIV, + GL_AND_REVERSE, + GL_AND_INVERTED, + GL_OR_REVERSE, + GL_OR_INVERTED, +}; static GLenum blendColor2Func(u32 fix) { if (fix == 0xFFFFFF) @@ -203,44 +221,9 @@ void TransformDrawEngine::ApplyDrawState(int prim) { bool wantLogicOps = !gstate.isModeClear() && gstate.isLogicOpEnabled(); glstate.colorLogicOp.set(wantLogicOps); - if(wantLogicOps) { - GLushort glLogicOp; - GELogicOp opcode = gstate.getLogicOp(); - if (opcode == GE_LOGIC_CLEAR) - glLogicOp = GL_CLEAR; - else if (opcode == GE_LOGIC_AND) - glLogicOp = GL_AND; - else if (opcode == GE_LOGIC_AND_REVERSE) - glLogicOp = GL_AND_REVERSE; - else if (opcode == GE_LOGIC_COPY) - glLogicOp = GL_COPY; - else if (opcode == GE_LOGIC_AND_INVERTED) - glLogicOp = GL_AND_INVERTED; - else if (opcode == GE_LOGIC_NOOP) - glLogicOp = GL_NOOP; - else if (opcode == GE_LOGIC_XOR) - glLogicOp = GL_XOR; - else if (opcode == GE_LOGIC_OR) - glLogicOp = GL_OR; - else if (opcode == GE_LOGIC_NOR) - glLogicOp = GL_NOR; - else if (opcode == GE_LOGIC_EQUIV) - glLogicOp = GL_EQUIV; - else if (opcode == GE_LOGIC_INVERTED) - glLogicOp = GL_INVERT; - else if (opcode == GE_LOGIC_OR_REVERSE) - glLogicOp = GL_OR_REVERSE; - else if (opcode == GE_LOGIC_COPY_INVERTED) - glLogicOp = GL_COPY_INVERTED; - else if (opcode == GE_LOGIC_OR_INVERTED) - glLogicOp = GL_OR_INVERTED; - else if (opcode == GE_LOGIC_NAND) - glLogicOp = GL_NAND; - else if (opcode == GE_LOGIC_SET) - glLogicOp = GL_SET; - glstate.logicOp.set(glLogicOp); - } - + if(wantLogicOps) + glstate.logicOp.set(logicOps[gstate.getLogicOp()]); + // Set Dither if (gstate.isDitherEnabled()) { glstate.dither.enable(); From ecf43c7ea96b0058e98bb8f902d956638100d648 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 6 Aug 2013 16:46:35 +0800 Subject: [PATCH 6/6] Fix lookup table --- GPU/GLES/StateMapping.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 4d0f329898..97ff84290f 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -94,21 +94,21 @@ static const GLushort stencilOps[] = { static const GLushort logicOps[] = { GL_CLEAR, - GL_SET, - GL_COPY, - GL_COPY_INVERTED, - GL_NOOP, - GL_INVERT, GL_AND, - GL_NAND, + GL_AND_REVERSE, + GL_COPY, + GL_AND_INVERTED, + GL_NOOP, + GL_XOR, GL_OR, GL_NOR, - GL_XOR, GL_EQUIV, - GL_AND_REVERSE, - GL_AND_INVERTED, + GL_INVERT, GL_OR_REVERSE, + GL_COPY_INVERTED, GL_OR_INVERTED, + GL_NAND, + GL_SET, }; static GLenum blendColor2Func(u32 fix) {