From b4855288e4de9001b4107d3d4c2f7aff4a4680f9 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Fri, 9 Jul 2010 21:19:28 -0400 Subject: mesa: add basic support for 2D register arrays to mesa just like in Gallium it's a basic functionality needed by a lot of modern graphcis extensions --- src/mesa/program/prog_instruction.h | 6 ++++++ src/mesa/program/prog_print.c | 14 +++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src/mesa/program') diff --git a/src/mesa/program/prog_instruction.h b/src/mesa/program/prog_instruction.h index bc980c6a7f..cb5beb9b00 100644 --- a/src/mesa/program/prog_instruction.h +++ b/src/mesa/program/prog_instruction.h @@ -271,6 +271,12 @@ struct prog_src_register * instruction which allows per-component negation. */ GLuint Negate:4; + + GLuint HasIndex2D:1; + GLuint RelAddr2D:1; + GLint Index2D:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. + * May be negative for relative + * addressing. */ }; diff --git a/src/mesa/program/prog_print.c b/src/mesa/program/prog_print.c index 80c9203e31..876b2d4618 100644 --- a/src/mesa/program/prog_print.c +++ b/src/mesa/program/prog_print.c @@ -265,7 +265,8 @@ arb_output_attrib_string(GLint index, GLenum progType) */ static const char * reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, - GLboolean relAddr, const struct gl_program *prog) + GLboolean relAddr, const struct gl_program *prog, + GLboolean hasIndex2D, GLboolean relAddr2D, GLint index2D) { static char str[100]; const char *addr = relAddr ? "ADDR+" : ""; @@ -275,6 +276,11 @@ reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, switch (mode) { case PROG_PRINT_DEBUG: sprintf(str, "%s[%s%d]", file_string(f, mode), addr, index); + if (hasIndex2D) { + int offset = strlen(str); + const char *addr2D = relAddr2D ? "ADDR+" : ""; + sprintf(str+offset, "[%s%d]", addr2D, index2D); + } break; case PROG_PRINT_ARB: @@ -478,7 +484,8 @@ fprint_dst_reg(FILE * f, { fprintf(f, "%s%s", reg_string((gl_register_file) dstReg->File, - dstReg->Index, mode, dstReg->RelAddr, prog), + dstReg->Index, mode, dstReg->RelAddr, prog, + GL_FALSE, GL_FALSE, 0), _mesa_writemask_string(dstReg->WriteMask)); if (dstReg->CondMask != COND_TR) { @@ -508,7 +515,8 @@ fprint_src_reg(FILE *f, fprintf(f, "%s%s%s%s", abs, reg_string((gl_register_file) srcReg->File, - srcReg->Index, mode, srcReg->RelAddr, prog), + srcReg->Index, mode, srcReg->RelAddr, prog, + srcReg->HasIndex2D, srcReg->RelAddr2D, srcReg->Index2D), _mesa_swizzle_string(srcReg->Swizzle, srcReg->Negate, GL_FALSE), abs); -- cgit v1.2.3 From 79b643dd02ac4e19f24c9cd88843719746f8ec69 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Sat, 10 Jul 2010 19:21:42 -0400 Subject: mesa: make uniform work with geometry shaders --- src/mesa/main/uniforms.c | 29 +++++++++++++++++++++++++++++ src/mesa/program/prog_uniform.c | 18 +++++++++++++----- 2 files changed, 42 insertions(+), 5 deletions(-) (limited to 'src/mesa/program') diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index c869942d2e..d68a7768df 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -132,6 +132,11 @@ get_uniform_parameter(const struct gl_shader_program *shProg, GLuint index) progPos = shProg->Uniforms->Uniforms[index].FragPos; if (progPos >= 0) { prog = &shProg->FragmentProgram->Base; + } else { + progPos = shProg->Uniforms->Uniforms[index].GeomPos; + if (progPos >= 0) { + prog = &shProg->GeometryProgram->Base; + } } } @@ -315,6 +320,11 @@ lookup_uniform_parameter(GLcontext *ctx, GLuint program, GLint location, progPos = shProg->Uniforms->Uniforms[location].FragPos; if (progPos >= 0) { prog = &shProg->FragmentProgram->Base; + } else { + progPos = shProg->Uniforms->Uniforms[location].GeomPos; + if (progPos >= 0) { + prog = &shProg->GeometryProgram->Base; + } } } } @@ -829,6 +839,15 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count, } } + if (shProg->GeometryProgram) { + /* convert uniform location to program parameter index */ + GLint index = uniform->GeomPos; + if (index >= 0) { + set_program_uniform(ctx, &shProg->GeometryProgram->Base, + index, offset, type, count, elems, values); + } + } + uniform->Initialized = GL_TRUE; } @@ -962,6 +981,16 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows, } } + if (shProg->GeometryProgram) { + /* convert uniform location to program parameter index */ + GLint index = uniform->GeomPos; + if (index >= 0) { + set_program_uniform_matrix(ctx, &shProg->GeometryProgram->Base, + index, offset, + count, rows, cols, transpose, values); + } + } + uniform->Initialized = GL_TRUE; } diff --git a/src/mesa/program/prog_uniform.c b/src/mesa/program/prog_uniform.c index c408a8492c..5aa9878d43 100644 --- a/src/mesa/program/prog_uniform.c +++ b/src/mesa/program/prog_uniform.c @@ -61,7 +61,8 @@ _mesa_append_uniform(struct gl_uniform_list *list, GLint index; assert(target == GL_VERTEX_PROGRAM_ARB || - target == GL_FRAGMENT_PROGRAM_ARB); + target == GL_FRAGMENT_PROGRAM_ARB || + target == MESA_GEOMETRY_PROGRAM); index = _mesa_lookup_uniform(list, name); if (index < 0) { @@ -90,6 +91,7 @@ _mesa_append_uniform(struct gl_uniform_list *list, uniform->Name = _mesa_strdup(name); uniform->VertPos = -1; uniform->FragPos = -1; + uniform->GeomPos = -1; uniform->Initialized = GL_FALSE; list->NumUniforms++; @@ -106,13 +108,18 @@ _mesa_append_uniform(struct gl_uniform_list *list, return GL_FALSE; } uniform->VertPos = progPos; - } - else { + } else if (target == GL_FRAGMENT_PROGRAM_ARB) { if (uniform->FragPos != -1) { /* this uniform is already in the list - that shouldn't happen */ return GL_FALSE; } uniform->FragPos = progPos; + } else { + if (uniform->GeomPos != -1) { + /* this uniform is already in the list - that shouldn't happen */ + return GL_FALSE; + } + uniform->GeomPos = progPos; } return uniform; @@ -156,10 +163,11 @@ _mesa_print_uniforms(const struct gl_uniform_list *list) GLuint i; printf("Uniform list %p:\n", (void *) list); for (i = 0; i < list->NumUniforms; i++) { - printf("%d: %s %d %d\n", + printf("%d: %s %d %d %d\n", i, list->Uniforms[i].Name, list->Uniforms[i].VertPos, - list->Uniforms[i].FragPos); + list->Uniforms[i].FragPos, + list->Uniforms[i].GeomPos); } } -- cgit v1.2.3 From 1491c6aa2de17760ab157a3fe71e45006e4eecf6 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Tue, 13 Jul 2010 21:49:53 -0400 Subject: mesa: add comments and change Index2D to just Index2 --- src/mesa/program/prog_instruction.h | 16 +++++++++++++--- src/mesa/program/prog_print.c | 10 +++++----- src/mesa/slang/slang_emit.c | 6 +++--- src/mesa/slang/slang_ir.c | 14 +++++++------- src/mesa/slang/slang_ir.h | 4 +++- src/mesa/slang/slang_link.c | 6 +++--- src/mesa/state_tracker/st_mesa_to_tgsi.c | 6 +++--- 7 files changed, 37 insertions(+), 25 deletions(-) (limited to 'src/mesa/program') diff --git a/src/mesa/program/prog_instruction.h b/src/mesa/program/prog_instruction.h index cb5beb9b00..dacbc33704 100644 --- a/src/mesa/program/prog_instruction.h +++ b/src/mesa/program/prog_instruction.h @@ -272,9 +272,19 @@ struct prog_src_register */ GLuint Negate:4; - GLuint HasIndex2D:1; - GLuint RelAddr2D:1; - GLint Index2D:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. + /** + * Is the register two-dimensional. + * Two dimensional registers are of the + * REGISTER[index][index2] format. + * They are used by the geometry shaders where + * the first index is the index within an array + * and the second index is the semantic of the + * array, e.g. gl_PositionIn[index] would become + * INPUT[index][gl_PositionIn] + */ + GLuint HasIndex2:1; + GLuint RelAddr2:1; + GLint Index2:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. * May be negative for relative * addressing. */ }; diff --git a/src/mesa/program/prog_print.c b/src/mesa/program/prog_print.c index 876b2d4618..6ab199aa02 100644 --- a/src/mesa/program/prog_print.c +++ b/src/mesa/program/prog_print.c @@ -266,7 +266,7 @@ arb_output_attrib_string(GLint index, GLenum progType) static const char * reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, GLboolean relAddr, const struct gl_program *prog, - GLboolean hasIndex2D, GLboolean relAddr2D, GLint index2D) + GLboolean hasIndex2, GLboolean relAddr2, GLint index2) { static char str[100]; const char *addr = relAddr ? "ADDR+" : ""; @@ -276,10 +276,10 @@ reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, switch (mode) { case PROG_PRINT_DEBUG: sprintf(str, "%s[%s%d]", file_string(f, mode), addr, index); - if (hasIndex2D) { + if (hasIndex2) { int offset = strlen(str); - const char *addr2D = relAddr2D ? "ADDR+" : ""; - sprintf(str+offset, "[%s%d]", addr2D, index2D); + const char *addr2 = relAddr2 ? "ADDR+" : ""; + sprintf(str+offset, "[%s%d]", addr2, index2); } break; @@ -516,7 +516,7 @@ fprint_src_reg(FILE *f, abs, reg_string((gl_register_file) srcReg->File, srcReg->Index, mode, srcReg->RelAddr, prog, - srcReg->HasIndex2D, srcReg->RelAddr2D, srcReg->Index2D), + srcReg->HasIndex2, srcReg->RelAddr2, srcReg->Index2), _mesa_swizzle_string(srcReg->Swizzle, srcReg->Negate, GL_FALSE), abs); diff --git a/src/mesa/slang/slang_emit.c b/src/mesa/slang/slang_emit.c index 15d75eb8fb..a9aa6fe1c3 100644 --- a/src/mesa/slang/slang_emit.c +++ b/src/mesa/slang/slang_emit.c @@ -379,8 +379,8 @@ storage_to_src_reg(struct prog_src_register *src, const slang_ir_storage *st) assert(GET_SWZ(swizzle, 3) <= SWIZZLE_W); src->Swizzle = swizzle; - src->HasIndex2D = st->Is2D; - src->Index2D = st->Index2D; + src->HasIndex2 = st->Is2D; + src->Index2 = st->Index2; src->RelAddr = relAddr; } @@ -2324,7 +2324,7 @@ emit_var_ref(slang_emit_info *emitInfo, slang_ir_node *n) * index */ if (emitInfo->prog->Target == MESA_GEOMETRY_PROGRAM && n->Store->Is2D) { - emitInfo->prog->InputsRead |= (1 << n->Store->Index2D); + emitInfo->prog->InputsRead |= (1 << n->Store->Index2); } else emitInfo->prog->InputsRead |= (1 << n->Store->Index); } diff --git a/src/mesa/slang/slang_ir.c b/src/mesa/slang/slang_ir.c index 131093d2a7..078c9369a8 100644 --- a/src/mesa/slang/slang_ir.c +++ b/src/mesa/slang/slang_ir.c @@ -134,7 +134,7 @@ _slang_init_ir_storage(slang_ir_storage *st, st->Parent = NULL; st->IsIndirect = GL_FALSE; st->Is2D = GL_FALSE; - st->Index2D = 0; + st->Index2 = 0; } @@ -154,7 +154,7 @@ _slang_new_ir_storage(gl_register_file file, GLint index, GLint size) st->Parent = NULL; st->IsIndirect = GL_FALSE; st->Is2D = GL_FALSE; - st->Index2D = 0; + st->Index2 = 0; } return st; } @@ -177,7 +177,7 @@ _slang_new_ir_storage_swz(gl_register_file file, GLint index, GLint size, st->Parent = NULL; st->IsIndirect = GL_FALSE; st->Is2D = GL_FALSE; - st->Index2D = 0; + st->Index2 = 0; } return st; } @@ -187,7 +187,7 @@ _slang_new_ir_storage_swz(gl_register_file file, GLint index, GLint size, */ slang_ir_storage * _slang_new_ir_storage_2d(gl_register_file file, - GLint index, GLint index2d, + GLint index, GLint index2, GLint size, GLuint swizzle) { slang_ir_storage *st; @@ -200,7 +200,7 @@ _slang_new_ir_storage_2d(gl_register_file file, st->Parent = NULL; st->IsIndirect = GL_FALSE; st->Is2D = GL_TRUE; - st->Index2D = index2d; + st->Index2 = index2; } return st; } @@ -224,7 +224,7 @@ _slang_new_ir_storage_relative(GLint index, GLint size, st->Parent = parent; st->IsIndirect = GL_FALSE; st->Is2D = GL_FALSE; - st->Index2D = 0; + st->Index2 = 0; } return st; } @@ -250,7 +250,7 @@ _slang_new_ir_storage_indirect(gl_register_file file, st->IndirectIndex = indirectIndex; st->IndirectSwizzle = indirectSwizzle; st->Is2D = GL_FALSE; - st->Index2D = 0; + st->Index2 = 0; } return st; } diff --git a/src/mesa/slang/slang_ir.h b/src/mesa/slang/slang_ir.h index 543cf0acc7..b7a373746b 100644 --- a/src/mesa/slang/slang_ir.h +++ b/src/mesa/slang/slang_ir.h @@ -189,8 +189,10 @@ struct slang_ir_storage_ GLuint IndirectSwizzle; GLuint TexTarget; /**< If File==PROGRAM_SAMPLER, one of TEXTURE_x_INDEX */ + /* Is the register two-dimensional and + * if so what's the second index */ GLboolean Is2D; - GLint Index2D; + GLint Index2; /** If Parent is non-null, Index is relative to parent. * The other fields are ignored. diff --git a/src/mesa/slang/slang_link.c b/src/mesa/slang/slang_link.c index 8d5a9e96ad..955ee79ed8 100644 --- a/src/mesa/slang/slang_link.c +++ b/src/mesa/slang/slang_link.c @@ -762,10 +762,10 @@ _slang_update_inputs_outputs(struct gl_program *prog) for (j = 0; j < numSrc; j++) { if (inst->SrcReg[j].File == PROGRAM_INPUT) { if (prog->Target == MESA_GEOMETRY_PROGRAM && - inst->SrcReg[j].HasIndex2D) + inst->SrcReg[j].HasIndex2) prog->InputsRead |= get_inputs_read_mask(prog->Target, - inst->SrcReg[j].Index2D, - inst->SrcReg[j].RelAddr2D); + inst->SrcReg[j].Index2, + inst->SrcReg[j].RelAddr2); else prog->InputsRead |= get_inputs_read_mask(prog->Target, inst->SrcReg[j].Index, diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c index c870db2d69..bacd091853 100644 --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c @@ -305,9 +305,9 @@ translate_src( struct st_translate *t, { struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); - if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2D) { - src = src_register( t, SrcReg->File, SrcReg->Index2D ); - if (SrcReg->RelAddr2D) + if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2) { + src = src_register( t, SrcReg->File, SrcReg->Index2 ); + if (SrcReg->RelAddr2) src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]), SrcReg->Index); else -- cgit v1.2.3