From 1a3eb3759708f41f0d57a271f2953e4de0506858 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Tue, 28 Sep 2021 12:22:51 +0300 Subject: [PATCH] Set array and matrix strides for default-block uniforms These are based on the client memory layout required by glUniform* calls. --- source/core/datatype.h | 12 ++++++++++++ source/core/program.cpp | 3 +++ 2 files changed, 15 insertions(+) diff --git a/source/core/datatype.h b/source/core/datatype.h index d7414a26..a0b80e35 100644 --- a/source/core/datatype.h +++ b/source/core/datatype.h @@ -96,6 +96,18 @@ inline bool is_matrix(DataType t) { return t&0xC000; } inline bool is_vector(DataType t) { return !is_matrix(t) && (t&0x3000); } inline bool is_image(DataType t) { return t&0x70000; } +inline DataType get_matrix_column_type(DataType t) +{ + unsigned cols = ((t&0xC000)>>14)+1; + return static_cast((t&~0xC0FF) | (get_type_size(t)/cols)); +} + +inline DataType get_element_type(DataType t) +{ + unsigned elems = (((t&0xC000)>>14)+1)*(((t&0x3000)>>12)+1); + return static_cast((t&~0xC0FF) | (get_type_size(t)/elems)); +} + GLenum get_gl_type(DataType); DataType from_gl_type(GLenum); diff --git a/source/core/program.cpp b/source/core/program.cpp index 4e090380..919fceeb 100644 --- a/source/core/program.cpp +++ b/source/core/program.cpp @@ -344,6 +344,9 @@ void Program::query_uniforms() { u.location = glGetUniformLocation(id, u.name.c_str()); u.block = &default_block; + u.array_stride = get_type_size(u.type); + if(is_matrix(u.type)) + u.matrix_stride = get_type_size(get_matrix_column_type(u.type)); default_block.uniforms.push_back(&u); if(is_image(u.type) && u.location>=0) -- 2.45.2