X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Funiform_query.cpp;h=3108d348d6fa90f88137c97cae6ef1419a331504;hb=e70d0d22a2dccc1df2c88890a2964491cdafac94;hp=ebe52253d58923fd19fc3afdbaeb52bfd9ef3961;hpb=6a524c76f502fe15bb3612065a23ece693aed237;p=mesa.git diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index ebe52253d58..3108d348d6f 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -35,7 +35,6 @@ #include "compiler/glsl/ir_uniform.h" #include "compiler/glsl/glsl_parser_extras.h" #include "compiler/glsl/program.h" -#include "program/hash_table.h" #include "util/bitscan.h" @@ -180,10 +179,10 @@ validate_uniform_parameters(struct gl_context *ctx, /* Check that the given location is in bounds of uniform remap table. * Unlinked programs will have NumUniformRemapTable == 0, so we can take - * the shProg->LinkStatus check out of the main path. + * the shProg->data->LinkStatus check out of the main path. */ if (unlikely(location >= (GLint) shProg->NumUniformRemapTable)) { - if (!shProg->LinkStatus) + if (!shProg->data->LinkStatus) _mesa_error(ctx, GL_INVALID_OPERATION, "%s(program not linked)", caller); else @@ -194,7 +193,7 @@ validate_uniform_parameters(struct gl_context *ctx, } if (location == -1) { - if (!shProg->LinkStatus) + if (!shProg->data->LinkStatus) _mesa_error(ctx, GL_INVALID_OPERATION, "%s(program not linked)", caller); @@ -382,9 +381,12 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location, case GLSL_TYPE_BOOL: dst[didx].f = src[sidx].i ? 1.0f : 0.0f; break; - case GLSL_TYPE_DOUBLE: - dst[didx].f = *(double *)&src[sidx].f; + case GLSL_TYPE_DOUBLE: { + double tmp; + memcpy(&tmp, &src[sidx].f, sizeof(tmp)); + dst[didx].f = tmp; break; + } default: assert(!"Should not get here."); break; @@ -392,20 +394,28 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location, break; case GLSL_TYPE_DOUBLE: switch (uni->type->base_type) { - case GLSL_TYPE_UINT: - *(double *)&dst[didx].f = (double) src[sidx].u; + case GLSL_TYPE_UINT: { + double tmp = src[sidx].u; + memcpy(&dst[didx].f, &tmp, sizeof(tmp)); break; + } case GLSL_TYPE_INT: case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_IMAGE: - *(double *)&dst[didx].f = (double) src[sidx].i; + case GLSL_TYPE_IMAGE: { + double tmp = src[sidx].i; + memcpy(&dst[didx].f, &tmp, sizeof(tmp)); break; - case GLSL_TYPE_BOOL: - *(double *)&dst[didx].f = src[sidx].i ? 1.0f : 0.0f; + } + case GLSL_TYPE_BOOL: { + double tmp = src[sidx].i ? 1.0 : 0.0; + memcpy(&dst[didx].f, &tmp, sizeof(tmp)); break; - case GLSL_TYPE_FLOAT: - *(double *)&dst[didx].f = (double) src[sidx].f; + } + case GLSL_TYPE_FLOAT: { + double tmp = src[sidx].f; + memcpy(&dst[didx].f, &tmp, sizeof(tmp)); break; + } default: assert(!"Should not get here."); break; @@ -437,9 +447,12 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location, case GLSL_TYPE_BOOL: dst[didx].i = src[sidx].i ? 1 : 0; break; - case GLSL_TYPE_DOUBLE: - dst[didx].i = IROUNDD(*(double *)&src[sidx].f); + case GLSL_TYPE_DOUBLE: { + double tmp; + memcpy(&tmp, &src[sidx].f, sizeof(tmp)); + dst[didx].i = IROUNDD(tmp); break; + } default: assert(!"Should not get here."); break; @@ -486,9 +499,12 @@ log_uniform(const void *values, enum glsl_base_type basicType, case GLSL_TYPE_FLOAT: printf("%g ", v[i].f); break; - case GLSL_TYPE_DOUBLE: - printf("%g ", *(double* )&v[i * 2].f); + case GLSL_TYPE_DOUBLE: { + double tmp; + memcpy(&tmp, &v[i * 2].f, sizeof(tmp)); + printf("%g ", tmp); break; + } default: assert(!"Should not get here."); break; @@ -578,14 +594,31 @@ _mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni, unsigned j; unsigned v; - for (j = 0; j < count; j++) { - for (v = 0; v < vectors; v++) { - memcpy(dst, src, src_vector_byte_stride); - src += src_vector_byte_stride; - dst += store->vector_stride; + if (src_vector_byte_stride == store->vector_stride) { + if (extra_stride) { + for (j = 0; j < count; j++) { + memcpy(dst, src, src_vector_byte_stride * vectors); + src += src_vector_byte_stride * vectors; + dst += store->vector_stride * vectors; + + dst += extra_stride; + } + } else { + /* Unigine Heaven benchmark gets here */ + memcpy(dst, src, src_vector_byte_stride * vectors * count); + src += src_vector_byte_stride * vectors * count; + dst += store->vector_stride * vectors * count; } + } else { + for (j = 0; j < count; j++) { + for (v = 0; v < vectors; v++) { + memcpy(dst, src, src_vector_byte_stride); + src += src_vector_byte_stride; + dst += store->vector_stride; + } - dst += extra_stride; + dst += extra_stride; + } } break; } @@ -859,10 +892,6 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg, flushed = true; } - memcpy(prog->SamplerUnits, - sh->SamplerUnits, - sizeof(sh->SamplerUnits)); - _mesa_update_shader_textures_used(shProg, prog); if (ctx->Driver.SamplerUniformChange) ctx->Driver.SamplerUniformChange(ctx, prog->Target, prog); @@ -1039,7 +1068,7 @@ _mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg, char *errMsg, size_t errMsgLength) { /* Shader does not have samplers. */ - if (shProg->NumUniformStorage == 0) + if (shProg->data->NumUniformStorage == 0) return true; if (!shProg->SamplersValidated) { @@ -1071,7 +1100,7 @@ _mesa_sampler_uniforms_pipeline_are_valid(struct gl_pipeline_object *pipeline) GLbitfield mask; GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS]; - struct gl_shader *shader; + struct gl_linked_shader *shader; unsigned active_samplers = 0; const struct gl_shader_program **shProg = (const struct gl_shader_program **) pipeline->CurrentProgram;