*/
#include <stdlib.h>
+#include <inttypes.h> /* for PRIx64 macro */
#include "main/core.h"
#include "main/context.h"
}
static struct gl_uniform_storage *
-validate_uniform_parameters(struct gl_context *ctx,
- struct gl_shader_program *shProg,
- GLint location, GLsizei count,
- unsigned *array_index,
- const char *caller)
+validate_uniform_parameters(GLint location, GLsizei count,
+ unsigned *array_index,
+ struct gl_context *ctx,
+ struct gl_shader_program *shProg,
+ const char *caller)
{
if (shProg == NULL) {
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(program not linked)", caller);
unsigned offset;
struct gl_uniform_storage *const uni =
- validate_uniform_parameters(ctx, shProg, location, 1,
- &offset, "glGetUniform");
+ validate_uniform_parameters(location, 1, &offset,
+ ctx, shProg, "glGetUniform");
if (uni == NULL) {
/* For glGetUniform, page 264 (page 278 of the PDF) of the OpenGL 2.1
* spec says:
&&
(uni->type->base_type == GLSL_TYPE_INT
|| uni->type->base_type == GLSL_TYPE_UINT
- || uni->type->base_type == GLSL_TYPE_SAMPLER
- || uni->type->base_type == GLSL_TYPE_IMAGE))
+ || uni->type->is_sampler()
+ || uni->type->is_image()))
|| ((returnType == GLSL_TYPE_UINT64 ||
returnType == GLSL_TYPE_INT64 ) &&
(uni->type->base_type == GLSL_TYPE_UINT64 ||
case GLSL_TYPE_INT64:
case GLSL_TYPE_UINT64:
switch (uni->type->base_type) {
- case GLSL_TYPE_UINT:
- *(int64_t *)&dst[didx].u = (int64_t) src[sidx].u;
+ case GLSL_TYPE_UINT: {
+ uint64_t tmp = src[sidx].u;
+ memcpy(&dst[didx].u, &tmp, sizeof(tmp));
break;
+ }
case GLSL_TYPE_INT:
case GLSL_TYPE_SAMPLER:
- case GLSL_TYPE_IMAGE:
- *(int64_t *)&dst[didx].u = (int64_t) src[sidx].i;
+ case GLSL_TYPE_IMAGE: {
+ int64_t tmp = src[sidx].i;
+ memcpy(&dst[didx].u, &tmp, sizeof(tmp));
break;
- case GLSL_TYPE_BOOL:
- *(int64_t *)&dst[didx].u = src[sidx].i ? 1.0f : 0.0f;
+ }
+ case GLSL_TYPE_BOOL: {
+ int64_t tmp = src[sidx].i ? 1.0f : 0.0f;
+ memcpy(&dst[didx].u, &tmp, sizeof(tmp));
break;
- case GLSL_TYPE_FLOAT:
- *(int64_t *)&dst[didx].u = (int64_t) src[sidx].f;
+ }
+ case GLSL_TYPE_FLOAT: {
+ int64_t tmp = src[sidx].f;
+ memcpy(&dst[didx].u, &tmp, sizeof(tmp));
break;
+ }
default:
assert(!"Should not get here.");
break;
case GLSL_TYPE_INT:
printf("%d ", v[i].i);
break;
- case GLSL_TYPE_UINT64:
- printf("%lu ", *(uint64_t* )&v[i * 2].u);
+ case GLSL_TYPE_UINT64: {
+ uint64_t tmp;
+ memcpy(&tmp, &v[i * 2].u, sizeof(tmp));
+ printf("%" PRIu64 " ", tmp);
break;
- case GLSL_TYPE_INT64:
- printf("%ld ", *(int64_t* )&v[i * 2].u);
+ }
+ case GLSL_TYPE_INT64: {
+ int64_t tmp;
+ memcpy(&tmp, &v[i * 2].u, sizeof(tmp));
+ printf("%" PRId64 " ", tmp);
break;
+ }
case GLSL_TYPE_FLOAT:
printf("%g ", v[i].f);
break;
* Called via glUniform*() functions.
*/
extern "C" void
-_mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
- GLint location, GLsizei count,
- const GLvoid *values,
- enum glsl_base_type basicType,
- unsigned src_components)
+_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;
struct gl_uniform_storage *const uni =
- validate_uniform_parameters(ctx, shProg, location, count,
- &offset, "glUniform");
+ validate_uniform_parameters(location, count, &offset,
+ ctx, shProg, "glUniform");
if (uni == NULL)
return;
* Note: cols=2, rows=4 ==> array[2] of vec4
*/
extern "C" void
-_mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
- GLuint cols, GLuint rows,
- GLint location, GLsizei count,
- GLboolean transpose,
- const GLvoid *values, enum glsl_base_type basicType)
+_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)
{
unsigned offset;
- unsigned vectors;
- unsigned components;
- unsigned elements;
- int size_mul;
struct gl_uniform_storage *const uni =
- validate_uniform_parameters(ctx, shProg, location, count,
- &offset, "glUniformMatrix");
+ validate_uniform_parameters(location, count, &offset,
+ ctx, shProg, "glUniformMatrix");
if (uni == NULL)
return;
}
assert(basicType == GLSL_TYPE_FLOAT || basicType == GLSL_TYPE_DOUBLE);
- size_mul = basicType == GLSL_TYPE_DOUBLE ? 2 : 1;
+ const unsigned size_mul = basicType == GLSL_TYPE_DOUBLE ? 2 : 1;
assert(!uni->type->is_sampler());
- vectors = uni->type->matrix_columns;
- components = uni->type->vector_elements;
+ const unsigned vectors = uni->type->matrix_columns;
+ const unsigned components = uni->type->vector_elements;
/* Verify that the types are compatible. This is greatly simplified for
* matrices because they can only have a float base type.
/* Store the data in the "actual type" backing storage for the uniform.
*/
- elements = components * vectors;
+ const unsigned elements = components * vectors;
if (!transpose) {
memcpy(&uni->storage[size_mul * elements * offset], values,