[Mesa-dev] [PATCH 00/32] UBOs for OpenGL ES 3.0
idr at freedesktop.org
Tue Jan 22 00:51:51 PST 2013
So here it is.
This is the last of the UBO instance and array instance rework for the
linker. It's a giant pile of patches, so let me explain what's going
Previous to this patch series, information about the layout of a UBO was
created at compile-time during ast-to-ir translation. This made it
somewhere between difficult and impossible to implement several require
features for OpenGL ES 3.0 conformance.
1. Uniform blocks with an instance name. These blocks have different
scoping rules, and the fields are exposed to applications differently
through the GL API. In the shader, these are accessed like structures.
2. Arrays of uniform blocks. These basically compound the issues of
instance names. For example, to query the layout of an instance array
block, you do *not* use the array index.
3. Marking unused block members and unused blocks as not active. This
was actually way more annoying to deal than I had expected. Even with
the std140 layout, if a block member is never used in a shader, it
should not show up in the active list.
All of these issues led me to a design that does all of the layout
during linking. This allows our usual dead variable elimination and a
bunch of other nice things.
To do this, I added a new type called GLSL_TYPE_INTERFACE. Interfaces
work mostly like structures, but they have additional semantic
limitations (imposed by the language). Once that was in place in the
compiler front-end, the linker just needed to detect unused blocks and
block members, cross-validate the blocks, and assign the offsets.
The bulk of the added code is in link_uniform_blocks. This is the real
work-horse of the whole deal. The functions that do all the
intra-shader layouts and name assignments for the blocks live here.
Other than the few cases mentioned in individual commit messages, there
are no commit-to-commit piglit or gles3conform regressions. I don't
believe there are any commit-to-commit build failures, but I'll double
check that before I push.
With this series, i965 passes all of the gles3conform UBO tests on IVB.
I believe there is still one issue on SNB, but I haven't tested it.
src/glsl/Makefile.sources | 2 +
src/glsl/ast.h | 12 ++-
src/glsl/ast_to_hir.cpp | 248 +++++++++++++++++++++++++++++++-------------------
src/glsl/builtin_types.h | 74 +++++++--------
src/glsl/glsl_parser.yy | 82 ++++++++++++-----
src/glsl/glsl_symbol_table.cpp | 14 +--
src/glsl/glsl_symbol_table.h | 1 -
src/glsl/glsl_types.cpp | 94 +++++++++++++++----
src/glsl/glsl_types.h | 43 ++++++++-
src/glsl/hir_field_selection.cpp | 3 +-
src/glsl/ir.cpp | 1 -
src/glsl/ir.h | 33 ++++---
src/glsl/ir_clone.cpp | 12 ++-
src/glsl/link_uniform_block_active_visitor.cpp | 162 +++++++++++++++++++++++++++++++++
src/glsl/link_uniform_block_active_visitor.h | 62 +++++++++++++
src/glsl/link_uniform_blocks.cpp | 313 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/glsl/link_uniform_initializers.cpp | 6 +-
src/glsl/link_uniforms.cpp | 250 +++++++++++++++++++++++++++++++++++----------------
src/glsl/linker.cpp | 25 ++----
src/glsl/linker.h | 45 +++++++++-
src/glsl/lower_ubo_reference.cpp | 104 ++++++++++++++++++---
src/glsl/opt_dead_code.cpp | 7 +-
src/glsl/tests/uniform_initializer_utils.cpp | 3 +
src/mesa/drivers/dri/i965/brw_fs.cpp | 8 +-
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 6 +-
src/mesa/drivers/dri/i965/brw_shader.cpp | 8 +-
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 10 ++-
src/mesa/main/mtypes.h | 27 ++++++
src/mesa/main/uniforms.c | 2 +-
src/mesa/program/ir_to_mesa.cpp | 26 ++++--
src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 8 +-
31 files changed, 1355 insertions(+), 336 deletions(-)
More information about the mesa-dev