From 9c1f010f3463d4e1ea488200390fa21f3db0b814 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 3 Jan 2018 11:26:41 -0800 Subject: [PATCH] mesa: Also track a remapped version of the color logic op MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit With the exception of NVIDIA hardware, these are is the values that all hardware and Gallium want. The remapping is currently implemented in at least 6 places. This starts the process of consolidating to a single place. v2: sed --in-place -e 's/color_logic_ops/gl_logicop_mode/g' $(grep -lr color_logic_ops src/) suggested by Brian. Added some comments about the selection of bit patterns for gl_logicop_mode and the GLenums. Suggested by Nicolai. Folded the GLenum_to_color_logicop macro into its only users. Signed-off-by: Ian Romanick Reviewed-by: Brian Paul [v1] Reviewed-by: Nicolai Hähnle --- src/mesa/main/blend.c | 20 ++++++++++++++++++++ src/mesa/main/mtypes.h | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c index 01721ab615d..1c3711766ec 100644 --- a/src/mesa/main/blend.c +++ b/src/mesa/main/blend.c @@ -849,6 +849,24 @@ _mesa_AlphaFunc( GLenum func, GLclampf ref ) } } +static const enum gl_logicop_mode color_logicop_mapping[16] = { + COLOR_LOGICOP_CLEAR, + COLOR_LOGICOP_AND, + COLOR_LOGICOP_AND_REVERSE, + COLOR_LOGICOP_COPY, + COLOR_LOGICOP_AND_INVERTED, + COLOR_LOGICOP_NOOP, + COLOR_LOGICOP_XOR, + COLOR_LOGICOP_OR, + COLOR_LOGICOP_NOR, + COLOR_LOGICOP_EQUIV, + COLOR_LOGICOP_INVERT, + COLOR_LOGICOP_OR_REVERSE, + COLOR_LOGICOP_COPY_INVERTED, + COLOR_LOGICOP_OR_INVERTED, + COLOR_LOGICOP_NAND, + COLOR_LOGICOP_SET +}; static ALWAYS_INLINE void logic_op(struct gl_context *ctx, GLenum opcode, bool no_error) @@ -884,6 +902,7 @@ logic_op(struct gl_context *ctx, GLenum opcode, bool no_error) FLUSH_VERTICES(ctx, ctx->DriverFlags.NewLogicOp ? 0 : _NEW_COLOR); ctx->NewDriverState |= ctx->DriverFlags.NewLogicOp; ctx->Color.LogicOp = opcode; + ctx->Color._LogicOp = color_logicop_mapping[opcode & 0x0f]; if (ctx->Driver.LogicOpcode) ctx->Driver.LogicOpcode(ctx, opcode); @@ -1189,6 +1208,7 @@ void _mesa_init_color( struct gl_context * ctx ) ctx->Color.IndexLogicOpEnabled = GL_FALSE; ctx->Color.ColorLogicOpEnabled = GL_FALSE; ctx->Color.LogicOp = GL_COPY; + ctx->Color._LogicOp = COLOR_LOGICOP_COPY; ctx->Color.DitherFlag = GL_TRUE; /* GL_FRONT is not possible on GLES. Instead GL_BACK will render to either diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index e587f63df2f..0c47be4ec72 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -413,6 +413,43 @@ union gl_color_union GLuint ui[4]; }; +/** + * Remapped color logical operations + * + * With the exception of NVIDIA hardware, which consumes the OpenGL enumerants + * directly, everything wants this mapping of color logical operations. + * + * Fun fact: These values are just the bit-reverse of the low-nibble of the GL + * enumerant values (i.e., `GL_NOOP & 0x0f` is `b0101' while + * \c COLOR_LOGICOP_NOOP is `b1010`). + * + * Fun fact #2: These values are just an encoding of the operation as a table + * of bit values. The result of the logic op is: + * + * result_bit = (logic_op >> (2 * src_bit + dst_bit)) & 1 + * + * For the GL enums, the result is: + * + * result_bit = logic_op & (1 << (2 * src_bit + dst_bit)) + */ +enum PACKED gl_logicop_mode { + COLOR_LOGICOP_CLEAR = 0, + COLOR_LOGICOP_NOR = 1, + COLOR_LOGICOP_AND_INVERTED = 2, + COLOR_LOGICOP_COPY_INVERTED = 3, + COLOR_LOGICOP_AND_REVERSE = 4, + COLOR_LOGICOP_INVERT = 5, + COLOR_LOGICOP_XOR = 6, + COLOR_LOGICOP_NAND = 7, + COLOR_LOGICOP_AND = 8, + COLOR_LOGICOP_EQUIV = 9, + COLOR_LOGICOP_NOOP = 10, + COLOR_LOGICOP_OR_INVERTED = 11, + COLOR_LOGICOP_COPY = 12, + COLOR_LOGICOP_OR_REVERSE = 13, + COLOR_LOGICOP_OR = 14, + COLOR_LOGICOP_SET = 15 +}; /** * Color buffer attribute group (GL_COLOR_BUFFER_BIT). @@ -488,6 +525,7 @@ struct gl_colorbuffer_attrib GLboolean IndexLogicOpEnabled; /**< Color index logic op enabled flag */ GLboolean ColorLogicOpEnabled; /**< RGBA logic op enabled flag */ GLenum LogicOp; /**< Logic operator */ + enum gl_logicop_mode _LogicOp; /*@}*/ -- 2.30.2