--- src/mesa/state_tracker/st_atom_constbuf.c | 8 +++ src/mesa/state_tracker/st_extensions.c | 4 + src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 92 ++++++++++++++-------------- 3 files changed, 59 insertions(+), 45 deletions(-)
diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c index 05667a7..8061347 100644 --- a/src/mesa/state_tracker/st_atom_constbuf.c +++ b/src/mesa/state_tracker/st_atom_constbuf.c @@ -45,6 +45,8 @@ #include "st_atom_constbuf.h" #include "st_program.h" +#include "st_cb_bufferobjects.h" + /** * Pass the given program parameters to the graphics pipe as a @@ -55,6 +57,7 @@ void st_upload_constants( struct st_context *st, struct gl_program_parameter_list *params, unsigned shader_type) { + unsigned i; struct pipe_context *pipe = st->pipe; assert(shader_type == PIPE_SHADER_VERTEX || @@ -100,6 +103,11 @@ void st_upload_constants( struct st_context *st, st->state.constants[shader_type].size = 0; st->pipe->set_constant_buffer(st->pipe, shader_type, 0, NULL); } + + for (i = 0; i < params->NumUBO; i++) { + struct st_buffer_object* buf = st_buffer_object(st->ctx->UniformBufferObject.BindingPoint[i]); + st->pipe->set_constant_buffer(st->pipe,shader_type,i+1,buf->buffer); + } } diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index c741d13..93f6bc6 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -670,4 +670,8 @@ void st_init_extensions(struct st_context *st) PIPE_BIND_SAMPLER_VIEW)) ctx->Extensions.ARB_texture_rgb10_a2ui = GL_TRUE; +#if FEATURE_ARB_uniform_buffer_object + if (screen->get_param(screen,PIPE_SHADER_CAP_MAX_CONST_BUFFERS) > 1) + ctx->Extensions.ARB_uniform_buffer_object = GL_TRUE; +#endif } diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 5e68b80..eaf8de7 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -299,6 +299,8 @@ public: struct gl_context *ctx; struct gl_program *prog; + struct gl_program_ubo_variable **indexed_uniforms; + unsigned starting_index; struct gl_shader_program *shader_program; struct gl_shader_compiler_options *options; @@ -326,6 +328,8 @@ public: st_src_reg st_src_reg_for_int(int val); st_src_reg st_src_reg_for_type(int type, int val); + st_src_reg generate_ubo_access_src_reg(const ir_variable *); + /** * \name Visit methods * @@ -1042,6 +1046,7 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir) variable_storage *storage; st_dst_reg dst; + if (i == ir->num_state_slots) { /* We'll set the index later. */ storage = new(mem_ctx) variable_storage(ir, PROGRAM_STATE_VAR, -1); @@ -1894,6 +1899,31 @@ glsl_to_tgsi_visitor::visit(ir_swizzle *ir) this->result = src; } +struct st_src_reg +glsl_to_tgsi_visitor::generate_ubo_access_src_reg(const ir_variable *var) +{ + int index,index2d; + struct gl_program_ubo_variable* ubovar = indexed_uniforms[var->location - starting_index]; + index = ubovar->Offset / 16; + index2d = ubovar->UBO->Index + 1; + + st_src_reg result = st_src_reg(PROGRAM_UNIFORM,index,var->type,index2d); + switch(ubovar->Offset - (index / 16) * 16) { + case 12: + result.swizzle = SWIZZLE_W; + case 8: + result.swizzle = SWIZZLE_Z; + case 4: + result.swizzle = SWIZZLE_Y; + default: + result.swizzle = SWIZZLE_XYZW; + + } + + + return result; +} + void glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir) { @@ -1948,6 +1978,11 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir) } } + if(var->mode == ir_var_uniform && var->is_ubo_variable) { + this->result = generate_ubo_access_src_reg(var); + return; + } + this->result = st_src_reg(entry->file, entry->index, var->type); if (!native_integers) this->result.type = GLSL_TYPE_FLOAT; @@ -4069,10 +4104,11 @@ dst_register(struct st_translate *t, */ static struct ureg_src src_register(struct st_translate *t, - gl_register_file file, - GLuint index) + const st_src_reg* src_reg) { - switch(file) { + int index = src_reg->index; + int index2d = src_reg->index2d; + switch(src_reg->file) { case PROGRAM_UNDEFINED: return ureg_src_undef(); @@ -4088,13 +4124,11 @@ src_register(struct st_translate *t, case PROGRAM_LOCAL_PARAM: case PROGRAM_UNIFORM: assert(index >= 0); - return t->constants[index]; + return ureg_src_register2d(TGSI_FILE_CONSTANT,index,index2d); case PROGRAM_STATE_VAR: case PROGRAM_CONSTANT: /* ie, immediate */ - if (index < 0) - return ureg_DECL_constant(t->ureg, 0); - else - return t->constants[index]; + assert(index >= 0); + return ureg_src_register(TGSI_FILE_CONSTANT,index); case PROGRAM_IMMEDIATE: return t->immediates[index]; @@ -4149,7 +4183,7 @@ translate_dst(struct st_translate *t, static struct ureg_src translate_src(struct st_translate *t, const st_src_reg *src_reg) { - struct ureg_src src = src_register(t, src_reg->file, src_reg->index); + struct ureg_src src = src_register(t, src_reg); src = ureg_swizzle(src, GET_SWZ(src_reg->swizzle, 0) & 0x3, @@ -4684,45 +4718,11 @@ st_translate_program( } } - /* Emit constants and uniforms. TGSI uses a single index space for these, + /* Emit constants and uniforms. TGSI uses a single index space for these, * so we put all the translated regs in t->constants. */ if (proginfo->Parameters) { - t->constants = (struct ureg_src *)CALLOC(proginfo->Parameters->NumParameters * sizeof(t->constants[0])); - if (t->constants == NULL) { - ret = PIPE_ERROR_OUT_OF_MEMORY; - goto out; - } - - for (i = 0; i < proginfo->Parameters->NumParameters; i++) { - switch (proginfo->Parameters->Parameters[i].Type) { - case PROGRAM_ENV_PARAM: - case PROGRAM_LOCAL_PARAM: - case PROGRAM_STATE_VAR: - case PROGRAM_NAMED_PARAM: - case PROGRAM_UNIFORM: - t->constants[i] = ureg_DECL_constant(ureg, i); - break; - - /* Emit immediates for PROGRAM_CONSTANT only when there's no indirect - * addressing of the const buffer. - * FIXME: Be smarter and recognize param arrays: - * indirect addressing is only valid within the referenced - * array. - */ - case PROGRAM_CONSTANT: - if (program->indirect_addr_consts) - t->constants[i] = ureg_DECL_constant(ureg, i); - else - t->constants[i] = emit_immediate(t, - proginfo->Parameters->ParameterValues[i], - proginfo->Parameters->Parameters[i].DataType, - 4); - break; - default: - break; - } - } + ureg_DECL_constant2D(t->ureg,0,proginfo->Parameters->NumParameters,0); } /* Emit immediate values. @@ -4806,6 +4806,8 @@ get_mesa_program(struct gl_context *ctx, struct gl_shader *shader) { glsl_to_tgsi_visitor* v = new glsl_to_tgsi_visitor(); + v->indexed_uniforms = shader_program->IndexedUBOVariables; + v->starting_index = shader_program->NumUserUniformStorage; struct gl_program *prog; struct pipe_screen * screen = st_context(ctx)->pipe->screen; unsigned pipe_shader_type; -- 1.7.7 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev