From: Ian Romanick <ian.d.roman...@intel.com>
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.
Signed-off-by: Ian Romanick <ian.d.roman...@intel.com>
---
src/mesa/main/blend.c | 22 ++++++++++++++++++++++
src/mesa/main/mtypes.h | 29 +++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c
index 01721ab..f47b102 100644
--- a/src/mesa/main/blend.c
+++ b/src/mesa/main/blend.c
@@ -849,6 +849,26 @@ _mesa_AlphaFunc( GLenum func, GLclampf ref )
}
}
+static const enum color_logic_ops 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
+};
+
+#define GLenum_to_color_logicop(x) color_logicop_mapping[x & 0x0f]
static ALWAYS_INLINE void
logic_op(struct gl_context *ctx, GLenum opcode, bool no_error)
@@ -884,6 +904,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 = GLenum_to_color_logicop(opcode);
if (ctx->Driver.LogicOpcode)
ctx->Driver.LogicOpcode(ctx, opcode);
@@ -1189,6 +1210,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 226eb94..2fbfd27 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -418,6 +418,34 @@ 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`).
+ */
+enum PACKED color_logic_ops {