Skip to content

Commit

Permalink
mesa: support boolean and integer-based parameters in prog_parameter
Browse files Browse the repository at this point in the history
The functionality is not used by anything yet, and the glUniform functions will need to be reworked before this can reach its full usefulness.  It is nonetheless a step towards integer support in the state tracker and classic drivers.
  • Loading branch information
Plombo committed May 17, 2011
1 parent 4fe806f commit 6ce44db
Show file tree
Hide file tree
Showing 13 changed files with 87 additions and 65 deletions.
3 changes: 2 additions & 1 deletion src/mesa/main/ff_fragment_shader.cpp
Expand Up @@ -875,7 +875,8 @@ static struct ureg register_const4f( struct texenv_fragment_program *p,
values[1] = s1;
values[2] = s2;
values[3] = s3;
idx = _mesa_add_unnamed_constant( p->program->Base.Parameters, values, 4,
idx = _mesa_add_unnamed_constant( p->program->Base.Parameters,
(gl_constant_value *) values, 4,
&swizzle );
r = make_ureg(PROGRAM_CONSTANT, idx);
r.swz = swizzle;
Expand Down
10 changes: 5 additions & 5 deletions src/mesa/main/ffvertex_prog.c
Expand Up @@ -455,13 +455,13 @@ static struct ureg register_const4f( struct tnl_program *p,
GLfloat s2,
GLfloat s3)
{
GLfloat values[4];
gl_constant_value values[4];
GLint idx;
GLuint swizzle;
values[0] = s0;
values[1] = s1;
values[2] = s2;
values[3] = s3;
values[0].f = s0;
values[1].f = s1;
values[2].f = s2;
values[3].f = s3;
idx = _mesa_add_unnamed_constant( p->program->Base.Parameters, values, 4,
&swizzle );
ASSERT(swizzle == SWIZZLE_NOOP);
Expand Down
10 changes: 5 additions & 5 deletions src/mesa/main/uniforms.c
Expand Up @@ -434,7 +434,7 @@ _mesa_get_uniformfv(struct gl_context *ctx, GLuint program, GLint location,
const int base = paramPos + offset + i;

for (j = 0; j < cols; j++ ) {
params[k++] = prog->Parameters->ParameterValues[base][j];
params[k++] = prog->Parameters->ParameterValues[base][j].f;
}
}
}
Expand Down Expand Up @@ -469,7 +469,7 @@ _mesa_get_uniformiv(struct gl_context *ctx, GLuint program, GLint location,
const int base = paramPos + offset + i;

for (j = 0; j < cols; j++ ) {
params[k++] = (GLint) prog->Parameters->ParameterValues[base][j];
params[k++] = (GLint) prog->Parameters->ParameterValues[base][j].f;
}
}
}
Expand Down Expand Up @@ -505,7 +505,7 @@ _mesa_get_uniformuiv(struct gl_context *ctx, GLuint program, GLint location,
const int base = paramPos + offset + i;

for (j = 0; j < cols; j++ ) {
params[k++] = (GLuint) prog->Parameters->ParameterValues[base][j];
params[k++] = (GLuint) prog->Parameters->ParameterValues[base][j].f;
}
}
}
Expand Down Expand Up @@ -701,7 +701,7 @@ set_program_uniform(struct gl_context *ctx, struct gl_program *program,
/* loop over number of samplers to change */
for (i = 0; i < count; i++) {
GLuint sampler =
(GLuint) program->Parameters->ParameterValues[index + offset + i][0];
(GLuint)program->Parameters->ParameterValues[index+offset + i][0].f;
GLuint texUnit = ((GLuint *) values)[i];

/* check that the sampler (tex unit index) is legal */
Expand Down Expand Up @@ -960,7 +960,7 @@ set_program_uniform_matrix(struct gl_context *ctx, struct gl_program *program,
/* Ignore writes beyond the end of (the used part of) an array */
return;
}
v = program->Parameters->ParameterValues[index + offset];
v = (GLfloat *) program->Parameters->ParameterValues[index + offset];
for (row = 0; row < rows; row++) {
if (transpose) {
v[row] = values[src + row * cols + col];
Expand Down
8 changes: 4 additions & 4 deletions src/mesa/program/ir_to_mesa.cpp
Expand Up @@ -599,7 +599,7 @@ ir_to_mesa_visitor::src_reg_for_float(float val)
src_reg src(PROGRAM_CONSTANT, -1, NULL);

src.index = _mesa_add_unnamed_constant(this->prog->Parameters,
&val, 1, &src.swizzle);
(const gl_constant_value *)&val, 1, &src.swizzle);

return src;
}
Expand Down Expand Up @@ -1799,7 +1799,7 @@ ir_to_mesa_visitor::visit(ir_constant *ir)

src = src_reg(PROGRAM_CONSTANT, -1, NULL);
src.index = _mesa_add_unnamed_constant(this->prog->Parameters,
values,
(gl_constant_value *) values,
ir->type->vector_elements,
&src.swizzle);
emit(ir, OPCODE_MOV, mat_column, src);
Expand Down Expand Up @@ -1837,7 +1837,7 @@ ir_to_mesa_visitor::visit(ir_constant *ir)

this->result = src_reg(PROGRAM_CONSTANT, -1, ir->type);
this->result.index = _mesa_add_unnamed_constant(this->prog->Parameters,
values,
(gl_constant_value *) values,
ir->type->vector_elements,
&this->result.swizzle);
}
Expand Down Expand Up @@ -2525,7 +2525,7 @@ add_uniforms_to_parameters_list(struct gl_shader_program *shader_program,
*/
if (file == PROGRAM_SAMPLER) {
for (unsigned int j = 0; j < size / 4; j++)
prog->Parameters->ParameterValues[index + j][0] = next_sampler++;
prog->Parameters->ParameterValues[index + j][0].f = next_sampler++;
}

/* The location chosen in the Parameters list here (returned
Expand Down
23 changes: 15 additions & 8 deletions src/mesa/program/nvfragparse.c
Expand Up @@ -472,8 +472,9 @@ Parse_ScalarConstant(struct parse_state *parseState, GLfloat *number)
const GLfloat *constant;
if (!Parse_Identifier(parseState, ident))
RETURN_ERROR1("Expected an identifier");
constant = _mesa_lookup_parameter_value(parseState->parameters,
-1, (const char *) ident);
constant = (GLfloat *)_mesa_lookup_parameter_value(parseState->parameters,
-1,
(const char *) ident);
/* XXX Check that it's a constant and not a parameter */
if (!constant) {
RETURN_ERROR1("Undefined symbol");
Expand Down Expand Up @@ -1039,7 +1040,8 @@ Parse_VectorSrc(struct parse_state *parseState,
if (!Parse_ScalarConstant(parseState, values))
RETURN_ERROR;
paramIndex = _mesa_add_unnamed_constant(parseState->parameters,
values, 4, NULL);
(gl_constant_value *) values,
4, NULL);
srcReg->File = PROGRAM_NAMED_PARAM;
srcReg->Index = paramIndex;
}
Expand All @@ -1051,7 +1053,8 @@ Parse_VectorSrc(struct parse_state *parseState,
if (!Parse_VectorConstant(parseState, values))
RETURN_ERROR;
paramIndex = _mesa_add_unnamed_constant(parseState->parameters,
values, 4, NULL);
(gl_constant_value *) values,
4, NULL);
srcReg->File = PROGRAM_NAMED_PARAM;
srcReg->Index = paramIndex;
}
Expand Down Expand Up @@ -1145,7 +1148,8 @@ Parse_ScalarSrcReg(struct parse_state *parseState,
if (!Parse_VectorConstant(parseState, values))
RETURN_ERROR;
paramIndex = _mesa_add_unnamed_constant(parseState->parameters,
values, 4, NULL);
(gl_constant_value *) values,
4, NULL);
srcReg->File = PROGRAM_NAMED_PARAM;
srcReg->Index = paramIndex;
}
Expand All @@ -1170,7 +1174,8 @@ Parse_ScalarSrcReg(struct parse_state *parseState,
if (!Parse_ScalarConstant(parseState, values))
RETURN_ERROR;
paramIndex = _mesa_add_unnamed_constant(parseState->parameters,
values, 4, NULL);
(gl_constant_value *) values,
4, NULL);
srcReg->Index = paramIndex;
srcReg->File = PROGRAM_NAMED_PARAM;
needSuffix = GL_FALSE;
Expand Down Expand Up @@ -1296,7 +1301,8 @@ Parse_InstructionSequence(struct parse_state *parseState,
RETURN_ERROR2(id, "already defined");
}
_mesa_add_named_parameter(parseState->parameters,
(const char *) id, value);
(const char *) id,
(gl_constant_value *) value);
}
else if (Parse_String(parseState, "DECLARE")) {
GLubyte id[100];
Expand All @@ -1315,7 +1321,8 @@ Parse_InstructionSequence(struct parse_state *parseState,
RETURN_ERROR2(id, "already declared");
}
_mesa_add_named_parameter(parseState->parameters,
(const char *) id, value);
(const char *) id,
(gl_constant_value *) value);
}
else if (Parse_String(parseState, "END")) {
inst->Opcode = OPCODE_END;
Expand Down
2 changes: 1 addition & 1 deletion src/mesa/program/prog_execute.c
Expand Up @@ -157,7 +157,7 @@ get_src_register_pointer(const struct prog_src_register *source,
case PROGRAM_NAMED_PARAM:
if (reg >= (GLint) prog->Parameters->NumParameters)
return ZeroVec;
return prog->Parameters->ParameterValues[reg];
return (GLfloat *) prog->Parameters->ParameterValues[reg];

case PROGRAM_SYSTEM_VALUE:
assert(reg < Elements(machine->SystemValues));
Expand Down
50 changes: 26 additions & 24 deletions src/mesa/program/prog_parameter.c
Expand Up @@ -56,8 +56,8 @@ _mesa_new_parameter_list_sized(unsigned size)
p->Parameters = (struct gl_program_parameter *)
calloc(1, size * sizeof(struct gl_program_parameter));

p->ParameterValues = (GLfloat (*)[4])
_mesa_align_malloc(size * 4 *sizeof(GLfloat), 16);
p->ParameterValues = (gl_constant_value (*)[4])
_mesa_align_malloc(size * 4 *sizeof(gl_constant_value), 16);


if ((p->Parameters == NULL) || (p->ParameterValues == NULL)) {
Expand Down Expand Up @@ -101,14 +101,15 @@ _mesa_free_parameter_list(struct gl_program_parameter_list *paramList)
* \param name the parameter name, will be duplicated/copied!
* \param size number of elements in 'values' vector (1..4, or more)
* \param datatype GL_FLOAT, GL_FLOAT_VECx, GL_INT, GL_INT_VECx or GL_NONE.
* \param values initial parameter value, up to 4 GLfloats, or NULL
* \param values initial parameter value, up to 4 gl_constant_values, or NULL
* \param state state indexes, or NULL
* \return index of new parameter in the list, or -1 if error (out of mem)
*/
GLint
_mesa_add_parameter(struct gl_program_parameter_list *paramList,
gl_register_file type, const char *name,
GLuint size, GLenum datatype, const GLfloat *values,
GLuint size, GLenum datatype,
const gl_constant_value *values,
const gl_state_index state[STATE_LENGTH],
GLbitfield flags)
{
Expand All @@ -127,10 +128,10 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
oldNum * sizeof(struct gl_program_parameter),
paramList->Size * sizeof(struct gl_program_parameter));

paramList->ParameterValues = (GLfloat (*)[4])
paramList->ParameterValues = (gl_constant_value (*)[4])
_mesa_align_realloc(paramList->ParameterValues, /* old buf */
oldNum * 4 * sizeof(GLfloat), /* old size */
paramList->Size * 4 *sizeof(GLfloat), /* new sz */
oldNum * 4 * sizeof(gl_constant_value),/* old sz */
paramList->Size*4*sizeof(gl_constant_value),/*new*/
16);
}

Expand All @@ -142,7 +143,7 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
return -1;
}
else {
GLuint i;
GLuint i, j;

paramList->NumParameters = oldNum + sz4;

Expand All @@ -163,7 +164,8 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
}
else {
/* silence valgrind */
ASSIGN_4V(paramList->ParameterValues[oldNum + i], 0, 0, 0, 0);
for (j = 0; j < 4; j++)
paramList->ParameterValues[oldNum + i][j].f = 0;
}
size -= 4;
}
Expand All @@ -184,7 +186,7 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
*/
GLint
_mesa_add_named_parameter(struct gl_program_parameter_list *paramList,
const char *name, const GLfloat values[4])
const char *name, const gl_constant_value values[4])
{
return _mesa_add_parameter(paramList, PROGRAM_NAMED_PARAM, name,
4, GL_NONE, values, NULL, 0x0);
Expand All @@ -204,17 +206,17 @@ _mesa_add_named_parameter(struct gl_program_parameter_list *paramList,
*/
GLint
_mesa_add_named_constant(struct gl_program_parameter_list *paramList,
const char *name, const GLfloat values[4],
const char *name, const gl_constant_value values[4],
GLuint size)
{
/* first check if this is a duplicate constant */
GLint pos;
for (pos = 0; pos < (GLint)paramList->NumParameters; pos++) {
const GLfloat *pvals = paramList->ParameterValues[pos];
if (pvals[0] == values[0] &&
pvals[1] == values[1] &&
pvals[2] == values[2] &&
pvals[3] == values[3] &&
const gl_constant_value *pvals = paramList->ParameterValues[pos];
if (pvals[0].u == values[0].u &&
pvals[1].u == values[1].u &&
pvals[2].u == values[2].u &&
pvals[3].u == values[3].u &&
strcmp(paramList->Parameters[pos].Name, name) == 0) {
/* Same name and value is already in the param list - reuse it */
return pos;
Expand All @@ -240,7 +242,7 @@ _mesa_add_named_constant(struct gl_program_parameter_list *paramList,
*/
GLint
_mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList,
const GLfloat values[4], GLuint size,
const gl_constant_value values[4], GLuint size,
GLuint *swizzleOut)
{
GLint pos;
Expand All @@ -262,7 +264,7 @@ _mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList,
struct gl_program_parameter *p = paramList->Parameters + pos;
if (p->Type == PROGRAM_CONSTANT && p->Size + size <= 4) {
/* ok, found room */
GLfloat *pVal = paramList->ParameterValues[pos];
gl_constant_value *pVal = paramList->ParameterValues[pos];
GLuint swz = p->Size; /* 1, 2 or 3 for Y, Z, W */
pVal[p->Size] = values[0];
p->Size++;
Expand Down Expand Up @@ -401,7 +403,7 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList,
* Lookup a parameter value by name in the given parameter list.
* \return pointer to the float[4] values.
*/
GLfloat *
gl_constant_value *
_mesa_lookup_parameter_value(const struct gl_program_parameter_list *paramList,
GLsizei nameLen, const char *name)
{
Expand Down Expand Up @@ -465,7 +467,7 @@ _mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList,
*/
GLboolean
_mesa_lookup_parameter_constant(const struct gl_program_parameter_list *list,
const GLfloat v[], GLuint vSize,
const gl_constant_value v[], GLuint vSize,
GLint *posOut, GLuint *swizzleOut)
{
GLuint i;
Expand All @@ -484,7 +486,7 @@ _mesa_lookup_parameter_constant(const struct gl_program_parameter_list *list,
/* swizzle not allowed */
GLuint j, match = 0;
for (j = 0; j < vSize; j++) {
if (v[j] == list->ParameterValues[i][j])
if (v[j].u == list->ParameterValues[i][j].u)
match++;
}
if (match == vSize) {
Expand All @@ -498,7 +500,7 @@ _mesa_lookup_parameter_constant(const struct gl_program_parameter_list *list,
/* look for v[0] anywhere within float[4] value */
GLuint j;
for (j = 0; j < list->Parameters[i].Size; j++) {
if (list->ParameterValues[i][j] == v[0]) {
if (list->ParameterValues[i][j].u == v[0].u) {
/* found it */
*posOut = i;
*swizzleOut = MAKE_SWIZZLE4(j, j, j, j);
Expand All @@ -511,13 +513,13 @@ _mesa_lookup_parameter_constant(const struct gl_program_parameter_list *list,
GLuint swz[4];
GLuint match = 0, j, k;
for (j = 0; j < vSize; j++) {
if (v[j] == list->ParameterValues[i][j]) {
if (v[j].u == list->ParameterValues[i][j].u) {
swz[j] = j;
match++;
}
else {
for (k = 0; k < list->Parameters[i].Size; k++) {
if (v[j] == list->ParameterValues[i][k]) {
if (v[j].u == list->ParameterValues[i][k].u) {
swz[j] = k;
match++;
break;
Expand Down

0 comments on commit 6ce44db

Please sign in to comment.