mesa: glsl: more writemask error checking
This commit is contained in:
@@ -1481,7 +1481,7 @@ _slang_simple_writemask(GLuint writemask, GLuint swizzle)
|
|||||||
* \return GL_FALSE for simple writemasks, GL_TRUE for non-simple
|
* \return GL_FALSE for simple writemasks, GL_TRUE for non-simple
|
||||||
*/
|
*/
|
||||||
static GLboolean
|
static GLboolean
|
||||||
swizzle_to_writemask(GLuint swizzle,
|
swizzle_to_writemask(slang_assemble_ctx *A, GLuint swizzle,
|
||||||
GLuint *writemaskOut, GLuint *swizzleOut)
|
GLuint *writemaskOut, GLuint *swizzleOut)
|
||||||
{
|
{
|
||||||
GLuint mask = 0x0, newSwizzle[4];
|
GLuint mask = 0x0, newSwizzle[4];
|
||||||
@@ -1495,6 +1495,18 @@ swizzle_to_writemask(GLuint swizzle,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
assert(swz >= 0 && swz <= 3);
|
assert(swz >= 0 && swz <= 3);
|
||||||
|
|
||||||
|
if (swizzle != SWIZZLE_XXXX &&
|
||||||
|
swizzle != SWIZZLE_YYYY &&
|
||||||
|
swizzle != SWIZZLE_ZZZZ &&
|
||||||
|
swizzle != SWIZZLE_WWWW &&
|
||||||
|
(mask & (1 << swz))) {
|
||||||
|
/* a channel can't be specified twice (ex: ".xyyz") */
|
||||||
|
slang_info_log_error(A->log, "Invalid writemask '%s'",
|
||||||
|
_mesa_swizzle_string(swizzle, 0, 0));
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
mask |= (1 << swz);
|
mask |= (1 << swz);
|
||||||
}
|
}
|
||||||
assert(mask <= 0xf);
|
assert(mask <= 0xf);
|
||||||
@@ -1590,11 +1602,11 @@ resolve_swizzle(const slang_operation *oper)
|
|||||||
* As above, but produce a writemask.
|
* As above, but produce a writemask.
|
||||||
*/
|
*/
|
||||||
static GLuint
|
static GLuint
|
||||||
resolve_writemask(const slang_operation *oper)
|
resolve_writemask(slang_assemble_ctx *A, const slang_operation *oper)
|
||||||
{
|
{
|
||||||
GLuint swizzle = resolve_swizzle(oper);
|
GLuint swizzle = resolve_swizzle(oper);
|
||||||
GLuint writemask, swizzleOut;
|
GLuint writemask, swizzleOut;
|
||||||
swizzle_to_writemask(swizzle, &writemask, &swizzleOut);
|
swizzle_to_writemask(A, swizzle, &writemask, &swizzleOut);
|
||||||
return writemask;
|
return writemask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1668,7 +1680,7 @@ _slang_gen_asm(slang_assemble_ctx *A, slang_operation *oper,
|
|||||||
|
|
||||||
dest_oper = &oper->children[0];
|
dest_oper = &oper->children[0];
|
||||||
|
|
||||||
writemask = resolve_writemask(dest_oper);
|
writemask = resolve_writemask(A, dest_oper);
|
||||||
|
|
||||||
n0 = _slang_gen_operation(A, dest_oper);
|
n0 = _slang_gen_operation(A, dest_oper);
|
||||||
if (!n0)
|
if (!n0)
|
||||||
@@ -3037,7 +3049,7 @@ _slang_gen_assignment(slang_assemble_ctx * A, slang_operation *oper)
|
|||||||
if (lhs && rhs) {
|
if (lhs && rhs) {
|
||||||
/* convert lhs swizzle into writemask */
|
/* convert lhs swizzle into writemask */
|
||||||
GLuint writemask, newSwizzle;
|
GLuint writemask, newSwizzle;
|
||||||
if (!swizzle_to_writemask(lhs->Store->Swizzle,
|
if (!swizzle_to_writemask(A, lhs->Store->Swizzle,
|
||||||
&writemask, &newSwizzle)) {
|
&writemask, &newSwizzle)) {
|
||||||
/* Non-simple writemask, need to swizzle right hand side in
|
/* Non-simple writemask, need to swizzle right hand side in
|
||||||
* order to put components into the right place.
|
* order to put components into the right place.
|
||||||
|
Reference in New Issue
Block a user