mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 17:10:11 +01:00
mesa: add double uniform support. (v5)
This adds support for the new uniform interfaces from ARB_gpu_shader_fp64. v2: support ARB_separate_shader_objects ProgramUniform*d* (Ian) don't allow boolean uniforms to be updated (issue 15) (Ian) v3: fix size_mul v4: Teach uniform update to take into account double precision (Topi) v5: add transpose for double case (Ilia) Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
bf257d2c90
commit
5cc486b4e3
4 changed files with 228 additions and 32 deletions
|
|
@ -469,6 +469,9 @@ 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);
|
||||
break;
|
||||
default:
|
||||
assert(!"Should not get here.");
|
||||
break;
|
||||
|
|
@ -529,11 +532,12 @@ _mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni,
|
|||
*/
|
||||
const unsigned components = MAX2(1, uni->type->vector_elements);
|
||||
const unsigned vectors = MAX2(1, uni->type->matrix_columns);
|
||||
const int dmul = uni->type->base_type == GLSL_TYPE_DOUBLE ? 2 : 1;
|
||||
|
||||
/* Store the data in the driver's requested type in the driver's storage
|
||||
* areas.
|
||||
*/
|
||||
unsigned src_vector_byte_stride = components * 4;
|
||||
unsigned src_vector_byte_stride = components * 4 * dmul;
|
||||
|
||||
for (i = 0; i < uni->num_driver_storage; i++) {
|
||||
struct gl_uniform_driver_storage *const store = &uni->driver_storage[i];
|
||||
|
|
@ -541,7 +545,7 @@ _mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni,
|
|||
const unsigned extra_stride =
|
||||
store->element_stride - (vectors * store->vector_stride);
|
||||
const uint8_t *src =
|
||||
(uint8_t *) (&uni->storage[array_index * (components * vectors)].i);
|
||||
(uint8_t *) (&uni->storage[array_index * (dmul * components * vectors)].i);
|
||||
|
||||
#if 0
|
||||
printf("%s: %p[%d] components=%u vectors=%u count=%u vector_stride=%u "
|
||||
|
|
@ -608,6 +612,7 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
|
|||
unsigned src_components)
|
||||
{
|
||||
unsigned offset;
|
||||
int size_mul = basicType == GLSL_TYPE_DOUBLE ? 2 : 1;
|
||||
|
||||
struct gl_uniform_storage *const uni =
|
||||
validate_uniform_parameters(ctx, shProg, location, count,
|
||||
|
|
@ -623,7 +628,7 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
|
|||
bool match;
|
||||
switch (uni->type->base_type) {
|
||||
case GLSL_TYPE_BOOL:
|
||||
match = true;
|
||||
match = (basicType != GLSL_TYPE_DOUBLE);
|
||||
break;
|
||||
case GLSL_TYPE_SAMPLER:
|
||||
case GLSL_TYPE_IMAGE:
|
||||
|
|
@ -710,8 +715,8 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
|
|||
/* Store the data in the "actual type" backing storage for the uniform.
|
||||
*/
|
||||
if (!uni->type->is_boolean()) {
|
||||
memcpy(&uni->storage[components * offset], values,
|
||||
sizeof(uni->storage[0]) * components * count);
|
||||
memcpy(&uni->storage[size_mul * components * offset], values,
|
||||
sizeof(uni->storage[0]) * components * count * size_mul);
|
||||
} else {
|
||||
const union gl_constant_value *src =
|
||||
(const union gl_constant_value *) values;
|
||||
|
|
@ -808,13 +813,14 @@ 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 GLfloat *values)
|
||||
GLboolean transpose,
|
||||
const GLvoid *values, GLenum type)
|
||||
{
|
||||
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");
|
||||
|
|
@ -827,6 +833,9 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
|
|||
return;
|
||||
}
|
||||
|
||||
assert(type == GL_FLOAT || type == GL_DOUBLE);
|
||||
size_mul = type == GL_DOUBLE ? 2 : 1;
|
||||
|
||||
assert(!uni->type->is_sampler());
|
||||
vectors = uni->type->matrix_columns;
|
||||
components = uni->type->vector_elements;
|
||||
|
|
@ -852,7 +861,7 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
|
|||
}
|
||||
|
||||
if (unlikely(ctx->_Shader->Flags & GLSL_UNIFORMS)) {
|
||||
log_uniform(values, GLSL_TYPE_FLOAT, components, vectors, count,
|
||||
log_uniform(values, uni->type->base_type, components, vectors, count,
|
||||
bool(transpose), shProg, location, uni);
|
||||
}
|
||||
|
||||
|
|
@ -879,13 +888,28 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
|
|||
|
||||
if (!transpose) {
|
||||
memcpy(&uni->storage[elements * offset], values,
|
||||
sizeof(uni->storage[0]) * elements * count);
|
||||
} else {
|
||||
sizeof(uni->storage[0]) * elements * count * size_mul);
|
||||
} else if (type == GL_FLOAT) {
|
||||
/* Copy and transpose the matrix.
|
||||
*/
|
||||
const float *src = values;
|
||||
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(type == GL_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++) {
|
||||
|
|
|
|||
|
|
@ -553,7 +553,7 @@ _mesa_UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
2, 2, location, count, transpose, value);
|
||||
2, 2, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -562,7 +562,7 @@ _mesa_UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
3, 3, location, count, transpose, value);
|
||||
3, 3, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -571,7 +571,7 @@ _mesa_UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
4, 4, location, count, transpose, value);
|
||||
4, 4, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
/** Same as above with direct state access **/
|
||||
|
|
@ -683,7 +683,7 @@ _mesa_ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix2fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -694,7 +694,7 @@ _mesa_ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix3fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -705,7 +705,7 @@ _mesa_ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix4fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -718,7 +718,7 @@ _mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
2, 3, location, count, transpose, value);
|
||||
2, 3, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -727,7 +727,7 @@ _mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
3, 2, location, count, transpose, value);
|
||||
3, 2, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -736,7 +736,7 @@ _mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
2, 4, location, count, transpose, value);
|
||||
2, 4, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -745,7 +745,7 @@ _mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
4, 2, location, count, transpose, value);
|
||||
4, 2, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -754,7 +754,7 @@ _mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
3, 4, location, count, transpose, value);
|
||||
3, 4, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -763,7 +763,7 @@ _mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
|
|||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
4, 3, location, count, transpose, value);
|
||||
4, 3, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
/** Same as above with direct state access **/
|
||||
|
|
@ -776,7 +776,7 @@ _mesa_ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix2x3fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -787,7 +787,7 @@ _mesa_ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix3x2fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -798,7 +798,7 @@ _mesa_ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix2x4fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -809,7 +809,7 @@ _mesa_ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix4x2fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -820,7 +820,7 @@ _mesa_ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix3x4fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
|
@ -831,7 +831,7 @@ _mesa_ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,
|
|||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix4x3fv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value);
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value, GL_FLOAT);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1342,194 +1342,343 @@ _mesa_GetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex,
|
|||
void GLAPIENTRY
|
||||
_mesa_Uniform1d(GLint location, GLdouble v0)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GLSL_TYPE_DOUBLE, 1);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_Uniform2d(GLint location, GLdouble v0, GLdouble v1)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLdouble v[2];
|
||||
v[0] = v0;
|
||||
v[1] = v1;
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_DOUBLE, 2);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_Uniform3d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLdouble v[3];
|
||||
v[0] = v0;
|
||||
v[1] = v1;
|
||||
v[2] = v2;
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_DOUBLE, 3);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_Uniform4d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2,
|
||||
GLdouble v3)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLdouble v[4];
|
||||
v[0] = v0;
|
||||
v[1] = v1;
|
||||
v[2] = v2;
|
||||
v[3] = v3;
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_DOUBLE, 4);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_Uniform1dv(GLint location, GLsizei count, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 1);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_Uniform2dv(GLint location, GLsizei count, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 2);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_Uniform3dv(GLint location, GLsizei count, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 3);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_Uniform4dv(GLint location, GLsizei count, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 4);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
2, 2, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
3, 3, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
4, 4, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble *value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
2, 3, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble *value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
3, 2, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble *value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
2, 4, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble *value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
4, 2, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble *value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
3, 4, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_UniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,
|
||||
const GLdouble *value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
_mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
|
||||
4, 3, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform1d(GLuint program, GLint location, GLdouble v0)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniform1d");
|
||||
_mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_DOUBLE, 1);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLdouble v[2];
|
||||
struct gl_shader_program *shProg;
|
||||
v[0] = v0;
|
||||
v[1] = v1;
|
||||
shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2d");
|
||||
_mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 2);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
|
||||
GLdouble v2)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLdouble v[3];
|
||||
struct gl_shader_program *shProg;
|
||||
v[0] = v0;
|
||||
v[1] = v1;
|
||||
v[2] = v2;
|
||||
shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3d");
|
||||
_mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 3);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
|
||||
GLdouble v2, GLdouble v3)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLdouble v[4];
|
||||
struct gl_shader_program *shProg;
|
||||
v[0] = v0;
|
||||
v[1] = v1;
|
||||
v[2] = v2;
|
||||
v[3] = v3;
|
||||
shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4d");
|
||||
_mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 4);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform1dv(GLuint program, GLint location, GLsizei count,
|
||||
const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniform1dv");
|
||||
_mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 1);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform2dv(GLuint program, GLint location, GLsizei count,
|
||||
const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniform2dv");
|
||||
_mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 2);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform3dv(GLuint program, GLint location, GLsizei count,
|
||||
const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniform3dv");
|
||||
_mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 3);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniform4dv(GLuint program, GLint location, GLsizei count,
|
||||
const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniform4dv");
|
||||
_mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 4);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix2dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix3dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix4dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix2x3dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix3x2dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix2x4dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix4x2dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix3x4dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLdouble * value)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_shader_program *shProg =
|
||||
_mesa_lookup_shader_program_err(ctx, program,
|
||||
"glProgramUniformMatrix4x3dv");
|
||||
_mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value, GL_DOUBLE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -362,7 +362,8 @@ void
|
|||
_mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
|
||||
GLuint cols, GLuint rows,
|
||||
GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLfloat *values);
|
||||
GLboolean transpose,
|
||||
const GLvoid *values, GLenum type);
|
||||
|
||||
void
|
||||
_mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
|
||||
|
|
|
|||
|
|
@ -606,6 +606,20 @@ type_size(const struct glsl_type *type)
|
|||
*/
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case GLSL_TYPE_DOUBLE:
|
||||
if (type->is_matrix()) {
|
||||
if (type->vector_elements > 2)
|
||||
return type->matrix_columns * 2;
|
||||
else
|
||||
return type->matrix_columns;
|
||||
} else {
|
||||
if (type->vector_elements > 2)
|
||||
return 2;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case GLSL_TYPE_ARRAY:
|
||||
assert(type->length > 0);
|
||||
return type_size(type->fields.array) * type->length;
|
||||
|
|
@ -2385,6 +2399,8 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
|
|||
|
||||
if (type->is_vector() || type->is_scalar()) {
|
||||
size = type->vector_elements;
|
||||
if (type->is_double())
|
||||
size *= 2;
|
||||
} else {
|
||||
size = type_size(type) * 4;
|
||||
}
|
||||
|
|
@ -2489,6 +2505,7 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
|
|||
enum gl_uniform_driver_format format = uniform_native;
|
||||
|
||||
unsigned columns = 0;
|
||||
int dmul = 4 * sizeof(float);
|
||||
switch (storage->type->base_type) {
|
||||
case GLSL_TYPE_UINT:
|
||||
assert(ctx->Const.NativeIntegers);
|
||||
|
|
@ -2500,6 +2517,11 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
|
|||
(ctx->Const.NativeIntegers) ? uniform_native : uniform_int_float;
|
||||
columns = 1;
|
||||
break;
|
||||
|
||||
case GLSL_TYPE_DOUBLE:
|
||||
if (storage->type->vector_elements > 2)
|
||||
dmul *= 2;
|
||||
/* fallthrough */
|
||||
case GLSL_TYPE_FLOAT:
|
||||
format = uniform_native;
|
||||
columns = storage->type->matrix_columns;
|
||||
|
|
@ -2524,8 +2546,8 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
|
|||
}
|
||||
|
||||
_mesa_uniform_attach_driver_storage(storage,
|
||||
4 * sizeof(float) * columns,
|
||||
4 * sizeof(float),
|
||||
dmul * columns,
|
||||
dmul,
|
||||
format,
|
||||
¶ms->ParameterValues[i]);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue