These will be used in the following patch to allow copying directly to the param list when packing is enabled. --- src/mesa/main/uniform_query.cpp | 154 ++++++++++++++++++++++++---------------- 1 file changed, 91 insertions(+), 63 deletions(-)
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index 5755b40..b13f506 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -1020,20 +1020,56 @@ _mesa_flush_vertices_for_uniforms(struct gl_context *ctx, unsigned index = u_bit_scan(&mask); assert(index < MESA_SHADER_STAGES); new_driver_state |= ctx->DriverFlags.NewShaderConstants[index]; } FLUSH_VERTICES(ctx, new_driver_state ? 0 : _NEW_PROGRAM_CONSTANTS); ctx->NewDriverState |= new_driver_state; } +static void +copy_uniforms_to_storage(struct gl_uniform_storage *uni, + struct gl_context *ctx, GLsizei count, + const GLvoid *values, const int size_mul, + const unsigned offset, const unsigned components, + enum glsl_base_type basicType) +{ + if (!uni->type->is_boolean() && !uni->is_bindless) { + memcpy(&uni->storage[size_mul * components * offset], values, + sizeof(uni->storage[0]) * components * count * size_mul); + } else if (uni->is_bindless) { + const union gl_constant_value *src = + (const union gl_constant_value *) values; + GLuint64 *dst = (GLuint64 *)&uni->storage[components * offset].i; + const unsigned elems = components * count; + + for (unsigned i = 0; i < elems; i++) { + dst[i] = src[i].i; + } + } else { + const union gl_constant_value *src = + (const union gl_constant_value *) values; + union gl_constant_value *dst = &uni->storage[components * offset]; + const unsigned elems = components * count; + + for (unsigned i = 0; i < elems; i++) { + if (basicType == GLSL_TYPE_FLOAT) { + dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue : 0; + } else { + dst[i].i = src[i].i != 0 ? ctx->Const.UniformBooleanTrue : 0; + } + } + } +} + + /** * Called via glUniform*() functions. */ extern "C" void _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, struct gl_context *ctx, struct gl_shader_program *shProg, enum glsl_base_type basicType, unsigned src_components) { unsigned offset; int size_mul = glsl_base_type_is_64bit(basicType) ? 2 : 1; @@ -1082,46 +1118,22 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, /* We check samplers for changes and flush if needed in the sampler * handling code further down, so just skip them here. */ if (!uni->type->is_sampler()) { _mesa_flush_vertices_for_uniforms(ctx, uni); } /* Store the data in the "actual type" backing storage for the uniform. */ - if (!uni->type->is_boolean() && !uni->is_bindless) { - memcpy(&uni->storage[size_mul * components * offset], values, - sizeof(uni->storage[0]) * components * count * size_mul); - } else if (uni->is_bindless) { - const union gl_constant_value *src = - (const union gl_constant_value *) values; - GLuint64 *dst = (GLuint64 *)&uni->storage[components * offset].i; - const unsigned elems = components * count; - - for (unsigned i = 0; i < elems; i++) { - dst[i] = src[i].i; - } - } else { - const union gl_constant_value *src = - (const union gl_constant_value *) values; - union gl_constant_value *dst = &uni->storage[components * offset]; - const unsigned elems = components * count; - - for (unsigned i = 0; i < elems; i++) { - if (basicType == GLSL_TYPE_FLOAT) { - dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue : 0; - } else { - dst[i].i = src[i].i != 0 ? ctx->Const.UniformBooleanTrue : 0; - } - } - } + copy_uniforms_to_storage(uni, ctx, count, values, size_mul, offset, + components, basicType); _mesa_propagate_uniforms_to_driver_storage(uni, offset, count); /* If the uniform is a sampler, do the extra magic necessary to propagate * the changes through. */ if (uni->type->is_sampler()) { bool flushed = false; shProg->SamplersValidated = GL_TRUE; @@ -1199,20 +1211,70 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, } else { sh->Program->sh.ImageUnits[unit] = value; } } } ctx->NewDriverState |= ctx->DriverFlags.NewImageUnits; } } + +static void +copy_uniform_matrix_to_storage(struct gl_uniform_storage *const uni, + GLsizei count, const void *values, + const unsigned size_mul, const unsigned offset, + const unsigned components, + const unsigned vectors, bool transpose, + unsigned cols, unsigned rows, + enum glsl_base_type basicType) +{ + const unsigned elements = components * vectors; + + if (!transpose) { + memcpy(&uni->storage[size_mul * elements * offset], values, + sizeof(uni->storage[0]) * elements * count * size_mul); + } else if (basicType == GLSL_TYPE_FLOAT) { + /* Copy and transpose the matrix. + */ + const float *src = (const float *)values; + float *dst = &uni->storage[elements * offset].f; + + for (int i = 0; i < count; i++) { + for (unsigned r = 0; r < rows; r++) { + for (unsigned c = 0; c < cols; c++) { + dst[(c * components) + r] = src[c + (r * vectors)]; + } + } + + dst += elements; + src += elements; + } + } else { + assert(basicType == GLSL_TYPE_DOUBLE); + const double *src = (const double *)values; + double *dst = (double *)&uni->storage[elements * offset].f; + + for (int i = 0; i < count; i++) { + for (unsigned r = 0; r < rows; r++) { + for (unsigned c = 0; c < cols; c++) { + dst[(c * components) + r] = src[c + (r * vectors)]; + } + } + + dst += elements; + src += elements; + } + } +} + + /** * Called by glUniformMatrix*() functions. * Note: cols=2, rows=4 ==> array[2] of vec4 */ extern "C" void _mesa_uniform_matrix(GLint location, GLsizei count, GLboolean transpose, const void *values, struct gl_context *ctx, struct gl_shader_program *shProg, GLuint cols, GLuint rows, enum glsl_base_type basicType) { @@ -1298,57 +1360,23 @@ _mesa_uniform_matrix(GLint location, GLsizei count, * will have already generated an error. */ if (uni->array_elements != 0) { count = MIN2(count, (int) (uni->array_elements - offset)); } _mesa_flush_vertices_for_uniforms(ctx, uni); /* Store the data in the "actual type" backing storage for the uniform. */ - const unsigned elements = components * vectors; - - if (!transpose) { - memcpy(&uni->storage[size_mul * elements * offset], values, - sizeof(uni->storage[0]) * elements * count * size_mul); - } else if (basicType == GLSL_TYPE_FLOAT) { - /* Copy and transpose the matrix. - */ - const float *src = (const float *)values; - float *dst = &uni->storage[elements * offset].f; - - for (int i = 0; i < count; i++) { - for (unsigned r = 0; r < rows; r++) { - for (unsigned c = 0; c < cols; c++) { - dst[(c * components) + r] = src[c + (r * vectors)]; - } - } - - dst += elements; - src += elements; - } - } else { - assert(basicType == GLSL_TYPE_DOUBLE); - const double *src = (const double *)values; - double *dst = (double *)&uni->storage[elements * offset].f; - - for (int i = 0; i < count; i++) { - for (unsigned r = 0; r < rows; r++) { - for (unsigned c = 0; c < cols; c++) { - dst[(c * components) + r] = src[c + (r * vectors)]; - } - } - - dst += elements; - src += elements; - } - } + copy_uniform_matrix_to_storage(uni, count, values, size_mul, offset, + components, vectors, transpose, cols, rows, + basicType); _mesa_propagate_uniforms_to_driver_storage(uni, offset, count); } static void update_bound_bindless_sampler_flag(struct gl_program *prog) { unsigned i; if (likely(!prog->sh.HasBoundBindlessSampler)) -- 2.9.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev