r600: Logic Operations Fix

fixes bug 23087
This commit is contained in:
vehemens
2009-08-02 18:03:58 -04:00
committed by Alex Deucher
parent 5e51903606
commit 562ca49611
+37 -5
View File
@@ -600,14 +600,46 @@ static void r700BlendFuncSeparate(GLcontext * ctx,
/**
* Translate LogicOp enums into hardware representation.
* Both use a very logical bit-wise layout, but unfortunately the order
* of bits is reversed.
*/
static GLuint translate_logicop(GLenum logicop)
{
GLuint bits = logicop - GL_CLEAR;
bits = ((bits & 1) << 3) | ((bits & 2) << 1) | ((bits & 4) >> 1) | ((bits & 8) >> 3);
return bits;
switch (logicop) {
case GL_CLEAR:
return 0x00;
case GL_SET:
return 0xff;
case GL_COPY:
return 0xcc;
case GL_COPY_INVERTED:
return 0x33;
case GL_NOOP:
return 0xaa;
case GL_INVERT:
return 0x55;
case GL_AND:
return 0x88;
case GL_NAND:
return 0x77;
case GL_OR:
return 0xee;
case GL_NOR:
return 0x11;
case GL_XOR:
return 0x66;
case GL_EQUIV:
return 0xaa;
case GL_AND_REVERSE:
return 0x44;
case GL_AND_INVERTED:
return 0x22;
case GL_OR_REVERSE:
return 0xdd;
case GL_OR_INVERTED:
return 0xbb;
default:
fprintf(stderr, "unknown blend logic operation %x\n", logicop);
return 0xcc;
}
}
/**