From f4ac13d6718d6433f69eb21311110c8225a95aee Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Fri, 14 Jul 2017 12:00:29 -0700 Subject: Adjust type layout when parameter block constains member using the same resource If we have something like to following in HLSL: cbuffer C { Texture2D t; ... } and we are compiling to GLSL, then both `C` and `C.t` consume the same kind of resource (a descriptor-table slot). The way reflection was working right now, querying the index of `C` would return its binding (let's say it is `4` just to be concrete) and then a query on `C::t` would give its offset, which was being computed as `0` because it is the first field in the logical `struct` type. That obviously leads to bad math and requires some subtle `+1`s in cases to get things right (e.g., when scalaring during lowering, I had to carefully add one in some cases). It is unreasonable to expect users to deal with this. This commit changes it so that the offset of field `C::t` is `1` so that hopefully more things Just Work. The special-case logic in lowering is now gone. One important catch here is that this pretty much only works in the case where the element type of a parameter block is a `struct` type (which is really all that makes sense right now). If we ever want to generalize this in the future, then it will probably be necessary to change the `TypeLayout` case for parameter blocks to store a `VarLayout` for the element, rather than just a `TypeLayout`. --- source/slang/type-layout.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'source/slang/type-layout.h') diff --git a/source/slang/type-layout.h b/source/slang/type-layout.h index d2254c9e5..d5c96abf2 100644 --- a/source/slang/type-layout.h +++ b/source/slang/type-layout.h @@ -535,6 +535,7 @@ SimpleLayoutInfo GetLayout(ExpressionType* type, LayoutRulesImpl* rules); SimpleLayoutInfo GetLayout(ExpressionType* type, LayoutRule rule = LayoutRule::Std430); RefPtr CreateTypeLayout(ExpressionType* type, LayoutRulesImpl* rules); +RefPtr CreateTypeLayout(ExpressionType* type, LayoutRulesImpl* rules, SimpleLayoutInfo offset); // @@ -544,15 +545,19 @@ createParameterBlockTypeLayout( RefPtr parameterBlockType, LayoutRulesImpl* rules); -// Create a type layout for a constant buffer type, -// in the case where we already know the layout -// for the element type. RefPtr createParameterBlockTypeLayout( RefPtr parameterBlockType, - RefPtr elementTypeLayout, - LayoutRulesImpl* rules); + LayoutRulesImpl* parameterBlockRules, + RefPtr elementType, + LayoutRulesImpl* elementTypeRules); +RefPtr +createParameterBlockTypeLayout( + RefPtr parameterBlockType, + LayoutRulesImpl* parameterBlockRules, + SimpleLayoutInfo parameterBlockInfo, + RefPtr elementTypeLayout); // Create a type layout for a structured buffer type. RefPtr -- cgit v1.2.3