summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/glsl/ast_to_hir.cpp2
-rw-r--r--src/compiler/glsl/builtin_variables.cpp1
-rw-r--r--src/compiler/glsl/link_uniform_blocks.cpp5
-rw-r--r--src/compiler/glsl/linker.cpp6
-rw-r--r--src/compiler/glsl/tests/general_ir_test.cpp2
-rw-r--r--src/compiler/glsl/tests/varyings_test.cpp1
-rw-r--r--src/compiler/glsl_types.cpp24
-rw-r--r--src/compiler/glsl_types.h13
-rw-r--r--src/mesa/main/mtypes.h1
9 files changed, 43 insertions, 12 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
index 6e2f253a77d..adedcbbdf3c 100644
--- a/src/compiler/glsl/ast_to_hir.cpp
+++ b/src/compiler/glsl/ast_to_hir.cpp
@@ -7516,6 +7516,8 @@ ast_interface_block::hir(exec_list *instructions,
glsl_type::get_interface_instance(fields,
num_variables,
packing,
+ matrix_layout ==
+ GLSL_MATRIX_LAYOUT_ROW_MAJOR,
this->block_name);
unsigned component_size = block_type->contains_double() ? 8 : 4;
diff --git a/src/compiler/glsl/builtin_variables.cpp b/src/compiler/glsl/builtin_variables.cpp
index 10a87502b41..ca266a4c37c 100644
--- a/src/compiler/glsl/builtin_variables.cpp
+++ b/src/compiler/glsl/builtin_variables.cpp
@@ -352,6 +352,7 @@ per_vertex_accumulator::construct_interface_instance() const
{
return glsl_type::get_interface_instance(this->fields, this->num_fields,
GLSL_INTERFACE_PACKING_STD140,
+ false,
"gl_PerVertex");
}
diff --git a/src/compiler/glsl/link_uniform_blocks.cpp b/src/compiler/glsl/link_uniform_blocks.cpp
index bb423c55410..c0bdfa934e0 100644
--- a/src/compiler/glsl/link_uniform_blocks.cpp
+++ b/src/compiler/glsl/link_uniform_blocks.cpp
@@ -247,6 +247,7 @@ process_block_array(struct uniform_block_array_elements *ub_array, char **name,
blocks[i].UniformBufferSize = 0;
blocks[i]._Packing = gl_uniform_block_packing(type->interface_packing);
+ blocks[i]._RowMajor = type->get_interface_row_major();
parcel->process(type, blocks[i].Name);
@@ -354,6 +355,7 @@ create_buffer_blocks(void *mem_ctx, struct gl_context *ctx,
blocks[i].UniformBufferSize = 0;
blocks[i]._Packing =
gl_uniform_block_packing(block_type->interface_packing);
+ blocks[i]._RowMajor = block_type->get_interface_row_major();
parcel.process(block_type,
b->has_instance_name ? block_type->name : "");
@@ -486,6 +488,9 @@ link_uniform_blocks_are_compatible(const gl_uniform_block *a,
if (a->_Packing != b->_Packing)
return false;
+ if (a->_RowMajor != b->_RowMajor)
+ return false;
+
for (unsigned i = 0; i < a->NumUniforms; i++) {
if (strcmp(a->Uniforms[i].Name, b->Uniforms[i].Name) != 0)
return false;
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 0b3c195219a..af0e29d44f4 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -1513,9 +1513,10 @@ private:
}
glsl_interface_packing packing =
(glsl_interface_packing) type->interface_packing;
+ bool row_major = (bool) type->interface_row_major;
const glsl_type *new_ifc_type =
glsl_type::get_interface_instance(fields, num_fields,
- packing, type->name);
+ packing, row_major, type->name);
delete [] fields;
return new_ifc_type;
}
@@ -1543,9 +1544,10 @@ private:
}
glsl_interface_packing packing =
(glsl_interface_packing) ifc_type->interface_packing;
+ bool row_major = (bool) ifc_type->interface_row_major;
const glsl_type *new_ifc_type =
glsl_type::get_interface_instance(fields, num_fields, packing,
- ifc_type->name);
+ row_major, ifc_type->name);
delete [] fields;
for (unsigned i = 0; i < num_fields; i++) {
if (interface_vars[i] != NULL)
diff --git a/src/compiler/glsl/tests/general_ir_test.cpp b/src/compiler/glsl/tests/general_ir_test.cpp
index 217305bf847..57917f33734 100644
--- a/src/compiler/glsl/tests/general_ir_test.cpp
+++ b/src/compiler/glsl/tests/general_ir_test.cpp
@@ -38,6 +38,7 @@ TEST(ir_variable_constructor, interface)
glsl_type::get_interface_instance(f,
ARRAY_SIZE(f),
GLSL_INTERFACE_PACKING_STD140,
+ false,
"simple_interface");
static const char name[] = "named_instance";
@@ -63,6 +64,7 @@ TEST(ir_variable_constructor, interface_array)
glsl_type::get_interface_instance(f,
ARRAY_SIZE(f),
GLSL_INTERFACE_PACKING_STD140,
+ false,
"simple_interface");
const glsl_type *const interface_array =
diff --git a/src/compiler/glsl/tests/varyings_test.cpp b/src/compiler/glsl/tests/varyings_test.cpp
index 7643e1bbbf9..eb134c9e8f2 100644
--- a/src/compiler/glsl/tests/varyings_test.cpp
+++ b/src/compiler/glsl/tests/varyings_test.cpp
@@ -83,6 +83,7 @@ link_varyings::link_varyings()
glsl_type::get_interface_instance(f,
ARRAY_SIZE(f),
GLSL_INTERFACE_PACKING_STD140,
+ false,
"simple_interface");
}
diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp
index 73e3abd329d..55e5285f6c1 100644
--- a/src/compiler/glsl_types.cpp
+++ b/src/compiler/glsl_types.cpp
@@ -51,7 +51,7 @@ glsl_type::glsl_type(GLenum gl_type,
gl_type(gl_type),
base_type(base_type),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
- sampled_type(0), interface_packing(0),
+ sampled_type(0), interface_packing(0), interface_row_major(0),
vector_elements(vector_elements), matrix_columns(matrix_columns),
length(0)
{
@@ -83,7 +83,7 @@ glsl_type::glsl_type(GLenum gl_type, glsl_base_type base_type,
base_type(base_type),
sampler_dimensionality(dim), sampler_shadow(shadow),
sampler_array(array), sampled_type(type), interface_packing(0),
- length(0)
+ interface_row_major(0), length(0)
{
mtx_lock(&glsl_type::mutex);
@@ -108,7 +108,7 @@ glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
gl_type(0),
base_type(GLSL_TYPE_STRUCT),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
- sampled_type(0), interface_packing(0),
+ sampled_type(0), interface_packing(0), interface_row_major(0),
vector_elements(0), matrix_columns(0),
length(num_fields)
{
@@ -149,11 +149,13 @@ glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
}
glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
- enum glsl_interface_packing packing, const char *name) :
+ enum glsl_interface_packing packing,
+ bool row_major, const char *name) :
gl_type(0),
base_type(GLSL_TYPE_INTERFACE),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
sampled_type(0), interface_packing((unsigned) packing),
+ interface_row_major((unsigned) row_major),
vector_elements(0), matrix_columns(0),
length(num_fields)
{
@@ -197,7 +199,7 @@ glsl_type::glsl_type(const glsl_type *return_type,
gl_type(0),
base_type(GLSL_TYPE_FUNCTION),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
- sampled_type(0), interface_packing(0),
+ sampled_type(0), interface_packing(0), interface_row_major(0),
vector_elements(0), matrix_columns(0),
length(num_params)
{
@@ -229,7 +231,7 @@ glsl_type::glsl_type(const char *subroutine_name) :
gl_type(0),
base_type(GLSL_TYPE_SUBROUTINE),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
- sampled_type(0), interface_packing(0),
+ sampled_type(0), interface_packing(0), interface_row_major(0),
vector_elements(1), matrix_columns(1),
length(0)
{
@@ -445,7 +447,7 @@ _mesa_glsl_release_types(void)
glsl_type::glsl_type(const glsl_type *array, unsigned length) :
base_type(GLSL_TYPE_ARRAY),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
- sampled_type(0), interface_packing(0),
+ sampled_type(0), interface_packing(0), interface_row_major(0),
vector_elements(0), matrix_columns(0),
length(length), name(NULL)
{
@@ -882,6 +884,9 @@ glsl_type::record_compare(const glsl_type *b, bool match_locations) const
if (this->interface_packing != b->interface_packing)
return false;
+ if (this->interface_row_major != b->interface_row_major)
+ return false;
+
/* From the GLSL 4.20 specification (Sec 4.2):
*
* "Structures must have the same name, sequence of type names, and
@@ -1028,9 +1033,10 @@ const glsl_type *
glsl_type::get_interface_instance(const glsl_struct_field *fields,
unsigned num_fields,
enum glsl_interface_packing packing,
+ bool row_major,
const char *block_name)
{
- const glsl_type key(fields, num_fields, packing, block_name);
+ const glsl_type key(fields, num_fields, packing, row_major, block_name);
mtx_lock(&glsl_type::mutex);
@@ -1044,7 +1050,7 @@ glsl_type::get_interface_instance(const glsl_struct_field *fields,
if (entry == NULL) {
mtx_unlock(&glsl_type::mutex);
const glsl_type *t = new glsl_type(fields, num_fields,
- packing, block_name);
+ packing, row_major, block_name);
mtx_lock(&glsl_type::mutex);
entry = _mesa_hash_table_insert(interface_types, t, (void *) t);
diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h
index b1e2f7a0181..e5b9f3ba03d 100644
--- a/src/compiler/glsl_types.h
+++ b/src/compiler/glsl_types.h
@@ -137,6 +137,7 @@ struct glsl_type {
* and \c GLSL_TYPE_UINT are valid.
*/
unsigned interface_packing:2;
+ unsigned interface_row_major:1;
/* Callers of this ralloc-based new need not call delete. It's
* easier to just ralloc_free 'mem_ctx' (or any of its ancestors). */
@@ -282,6 +283,7 @@ struct glsl_type {
static const glsl_type *get_interface_instance(const glsl_struct_field *fields,
unsigned num_fields,
enum glsl_interface_packing packing,
+ bool row_major,
const char *block_name);
/**
@@ -770,6 +772,14 @@ struct glsl_type {
return (enum glsl_interface_packing)interface_packing;
}
+ /**
+ * Check if the type interface is row major
+ */
+ bool get_interface_row_major() const
+ {
+ return (bool) interface_row_major;
+ }
+
private:
static mtx_t mutex;
@@ -799,7 +809,8 @@ private:
/** Constructor for interface types */
glsl_type(const glsl_struct_field *fields, unsigned num_fields,
- enum glsl_interface_packing packing, const char *name);
+ enum glsl_interface_packing packing,
+ bool row_major, const char *name);
/** Constructor for interface types */
glsl_type(const glsl_type *return_type,
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 88397b93e57..79dd1c51df7 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2577,6 +2577,7 @@ struct gl_uniform_block
* cross-validating uniform blocks.
*/
enum gl_uniform_block_packing _Packing;
+ GLboolean _RowMajor;
};
/**