Merge pull request #2285 from tex3d/refl-offsets

- Added test with a number of apparently untested cases
- Updated some tests used for the more exhaustive reflection test
  which were failing to compile on fxc due to utf-8 bom and bool `|=`.
- Don't ignore dxc failures with ignore dxbc fails flag.
This commit is contained in:
Tex Riddell 2019-06-20 22:14:51 -07:00 коммит произвёл GitHub
Родитель 365e6e8aa9 ff9d11be9d
Коммит 4610aa7cbb
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
18 изменённых файлов: 472 добавлений и 86 удалений

Просмотреть файл

@ -1002,8 +1002,7 @@ HRESULT CShaderReflectionType::Initialize(
fieldReflectionType = new CShaderReflectionType();
allTypes.push_back(std::unique_ptr<CShaderReflectionType>(fieldReflectionType));
unsigned int elementOffset = structLayout ?
baseOffset + (unsigned int)structLayout->getElementOffset(ff) : 0;
unsigned int elementOffset = structLayout ? (unsigned int)structLayout->getElementOffset(ff) : 0;
fieldReflectionType->Initialize(M, fieldType, fieldAnnotation, elementOffset, allTypes, isCBuffer);

Просмотреть файл

@ -581,6 +581,8 @@ static unsigned AlignBaseOffset(unsigned baseOffset, unsigned size,
needNewAlign |= !bRowMajor && col > 1;
needNewAlign |= bRowMajor && row > 1;
} else if (Ty->isStructureOrClassType() && ! hlsl::IsHLSLVecType(Ty)) {
needNewAlign = true;
}
unsigned scalarSizeInBytes = 4;
@ -3000,16 +3002,27 @@ void CGMSHLSLRuntime::SetEntryFunction() {
m_pHLModule->SetEntryFunction(Entry.Func);
}
// Here the size is CB size. So don't need check type.
static unsigned AlignCBufferOffset(unsigned offset, unsigned size, llvm::Type *Ty) {
// Here the size is CB size.
// Offset still needs to be aligned based on type since this
// is the legacy cbuffer global path.
static unsigned AlignCBufferOffset(unsigned offset, unsigned size, llvm::Type *Ty, bool bRowMajor) {
DXASSERT(!(offset & 1), "otherwise we have an invalid offset.");
bool bNeedNewRow = Ty->isArrayTy();
if (!bNeedNewRow && Ty->isStructTy()) {
if (HLMatrixType mat = HLMatrixType::dyn_cast(Ty)) {
bNeedNewRow |= !bRowMajor && mat.getNumColumns() > 1;
bNeedNewRow |= bRowMajor && mat.getNumRows() > 1;
} else {
bNeedNewRow = true;
}
}
unsigned scalarSizeInBytes = Ty->getScalarSizeInBits() / 8;
return AlignBufferOffsetInLegacy(offset, size, scalarSizeInBytes, bNeedNewRow);
}
static unsigned AllocateDxilConstantBuffer(HLCBuffer &CB) {
static unsigned AllocateDxilConstantBuffer(HLCBuffer &CB,
std::unordered_map<Constant*, DxilFieldAnnotation> &constVarAnnotationMap) {
unsigned offset = 0;
// Scan user allocated constants first.
@ -3030,8 +3043,12 @@ static unsigned AllocateDxilConstantBuffer(HLCBuffer &CB) {
unsigned size = C->GetRangeSize();
llvm::Type *Ty = C->GetGlobalSymbol()->getType()->getPointerElementType();
auto fieldAnnotation = constVarAnnotationMap.at(C->GetGlobalSymbol());
bool bRowMajor = HLMatrixType::isa(Ty)
? fieldAnnotation.GetMatrixAnnotation().Orientation == MatrixOrientation::RowMajor
: false;
// Align offset.
offset = AlignCBufferOffset(offset, size, Ty);
offset = AlignCBufferOffset(offset, size, Ty, bRowMajor);
if (C->GetLowerBound() == UINT_MAX) {
C->SetLowerBound(offset);
}
@ -3040,10 +3057,11 @@ static unsigned AllocateDxilConstantBuffer(HLCBuffer &CB) {
return offset;
}
static void AllocateDxilConstantBuffers(HLModule *pHLModule) {
static void AllocateDxilConstantBuffers(HLModule *pHLModule,
std::unordered_map<Constant*, DxilFieldAnnotation> &constVarAnnotationMap) {
for (unsigned i = 0; i < pHLModule->GetCBuffers().size(); i++) {
HLCBuffer &CB = *static_cast<HLCBuffer*>(&(pHLModule->GetCBuffer(i)));
unsigned size = AllocateDxilConstantBuffer(CB);
unsigned size = AllocateDxilConstantBuffer(CB, constVarAnnotationMap);
CB.SetSize(size);
}
}
@ -4837,7 +4855,7 @@ void CGMSHLSLRuntime::FinishCodeGen() {
}
// Allocate constant buffers.
AllocateDxilConstantBuffers(m_pHLModule);
AllocateDxilConstantBuffers(m_pHLModule, m_ConstVarAnnotationMap);
// TODO: create temp variable for constant which has store use.
// Create Global variable and type annotation for each CBuffer.

Просмотреть файл

@ -929,7 +929,7 @@ void finish_quantize_0( inout bool bBadQuantize, inout int2x3 endPoint, uint4 pr
{
bool3 bBadComponent = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? true : false )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadQuantize |= any(bBadComponent);
bBadQuantize = bBadQuantize || any(bBadComponent);
endPoint[0] = endPoint[0] & ( ( 1 << prec.x ) - 1 );
endPoint[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[1] )
@ -949,7 +949,7 @@ void finish_quantize_1( inout bool bBadQuantize, inout int2x3 endPoint, uint4 pr
: ( ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadComponent[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? true : false )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadQuantize |= any(bBadComponent);
bBadQuantize = bBadQuantize || any(bBadComponent);
endPoint[0] = ( endPoint[0] >= 0 ) ? ( ( endPoint[0] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[0] )
: ( ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) ) ? ( 1 << ( prec.yzw - 1 ) ) : ( endPoint[0] & ( ( 1 << prec.yzw ) - 1 ) ) );

Просмотреть файл

@ -929,7 +929,7 @@ void finish_quantize_0( inout bool bBadQuantize, inout int2x3 endPoint, uint4 pr
{
bool3 bBadComponent = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? true : false )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadQuantize |= any(bBadComponent);
bBadQuantize = bBadQuantize || any(bBadComponent);
endPoint[0] = endPoint[0] & ( ( 1 << prec.x ) - 1 );
endPoint[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[1] )
@ -949,7 +949,7 @@ void finish_quantize_1( inout bool bBadQuantize, inout int2x3 endPoint, uint4 pr
: ( ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadComponent[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? true : false )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadQuantize |= any(bBadComponent);
bBadQuantize = bBadQuantize || any(bBadComponent);
endPoint[0] = ( endPoint[0] >= 0 ) ? ( ( endPoint[0] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[0] )
: ( ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) ) ? ( 1 << ( prec.yzw - 1 ) ) : ( endPoint[0] & ( ( 1 << prec.yzw ) - 1 ) ) );

Просмотреть файл

@ -929,7 +929,7 @@ void finish_quantize_0( inout bool bBadQuantize, inout int2x3 endPoint, uint4 pr
{
bool3 bBadComponent = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? true : false )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadQuantize |= any(bBadComponent);
bBadQuantize = bBadQuantize || any(bBadComponent);
endPoint[0] = endPoint[0] & ( ( 1 << prec.x ) - 1 );
endPoint[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[1] )
@ -949,7 +949,7 @@ void finish_quantize_1( inout bool bBadQuantize, inout int2x3 endPoint, uint4 pr
: ( ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadComponent[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? true : false )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? true : false );
bBadQuantize |= any(bBadComponent);
bBadQuantize = bBadQuantize || any(bBadComponent);
endPoint[0] = ( endPoint[0] >= 0 ) ? ( ( endPoint[0] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[0] )
: ( ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) ) ? ( 1 << ( prec.yzw - 1 ) ) : ( endPoint[0] & ( ( 1 << prec.yzw ) - 1 ) ) );

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -16,7 +16,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -13,7 +13,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferStore
@ -12,7 +12,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -17,7 +17,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: flattenedThreadIdInGroup
@ -20,7 +20,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -14,7 +14,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -21,7 +21,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: flattenedThreadIdInGroup
@ -20,7 +20,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -18,7 +18,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -15,7 +15,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -1,4 +1,4 @@
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
// CHECK: threadId
// CHECK: bufferLoad
@ -13,7 +13,7 @@
//--------------------------------------------------------------------------------------
// Smoothed Particle Hydrodynamics Algorithm Based Upon:
// Particle-Based Fluid Simulation for Interactive Applications
// Matthias Müller
// Matthias Müller
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

Просмотреть файл

@ -8,13 +8,13 @@
// CHECK-NEXT: ID3D12ShaderReflectionConstantBuffer:
// CHECK-NEXT: D3D12_SHADER_BUFFER_DESC: Name: CB
// CHECK-NEXT: Type: D3D_CT_CBUFFER
// CHECK-NEXT: Size: 32
// CHECK-NEXT: Size: 128
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: Num Variables: 1
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: CB
// CHECK-NEXT: Size: 28
// CHECK-NEXT: Size: 116
// CHECK-NEXT: StartOffset: 0
// CHECK-NEXT: uFlags: 0x2
// CHECK-NEXT: DefaultValue: <nullptr>
@ -24,8 +24,8 @@
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 5
// CHECK-NEXT: Members: 3
// CHECK-NEXT: Columns: 16
// CHECK-NEXT: Members: 8
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
@ -38,14 +38,43 @@
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S0
// CHECK-NEXT: Class: D3D_SVC_STRUCT
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 3
// CHECK-NEXT: Members: 2
// CHECK-NEXT: Offset: 16
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 8
// CHECK-NEXT: }
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 4
// CHECK-NEXT: Offset: 32
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float3
// CHECK-NEXT: Class: D3D_SVC_VECTOR
@ -54,20 +83,292 @@
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 3
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 16
// CHECK-NEXT: Offset: 48
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 64
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float2x1
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 2
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 72
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 80
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float1x2
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 96
// CHECK-NEXT: }
// CHECK-NEXT: CBuffer: CB
// CHECK-NEXT: }
// CHECK-NEXT: ID3D12ShaderReflectionConstantBuffer:
// CHECK-NEXT: D3D12_SHADER_BUFFER_DESC: Name: CB1
// CHECK-NEXT: Type: D3D_CT_CBUFFER
// CHECK-NEXT: Size: 208
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: Num Variables: 7
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: s1
// CHECK-NEXT: Size: 116
// CHECK-NEXT: StartOffset: 0
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: DefaultValue: <nullptr>
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S1
// CHECK-NEXT: Class: D3D_SVC_STRUCT
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 16
// CHECK-NEXT: Members: 8
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S0
// CHECK-NEXT: Class: D3D_SVC_STRUCT
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 3
// CHECK-NEXT: Members: 2
// CHECK-NEXT: Offset: 16
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 8
// CHECK-NEXT: }
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 32
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float3
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 3
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 48
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 64
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float2x1
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 2
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 72
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 80
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float1x2
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 96
// CHECK-NEXT: }
// CHECK-NEXT: CBuffer: CB1
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: s2
// CHECK-NEXT: Size: 4
// CHECK-NEXT: StartOffset: 128
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: DefaultValue: <nullptr>
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S2
// CHECK-NEXT: Class: D3D_SVC_STRUCT
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 1
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: }
// CHECK-NEXT: CBuffer: CB1
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: s3
// CHECK-NEXT: Size: 4
// CHECK-NEXT: StartOffset: 144
// CHECK-NEXT: uFlags: 0x2
// CHECK-NEXT: DefaultValue: <nullptr>
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S2
// CHECK-NEXT: Class: D3D_SVC_STRUCT
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 1
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: }
// CHECK-NEXT: CBuffer: CB1
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: c
// CHECK-NEXT: Size: 12
// CHECK-NEXT: StartOffset: 148
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: DefaultValue: <nullptr>
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float3
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 3
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: CBuffer: CB1
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: k
// CHECK-NEXT: Size: 4
// CHECK-NEXT: StartOffset: 160
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: DefaultValue: <nullptr>
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: CBuffer: CB1
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: f2x1
// CHECK-NEXT: Size: 8
// CHECK-NEXT: StartOffset: 164
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: DefaultValue: <nullptr>
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float2x1
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 2
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: CBuffer: CB1
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: f1x2
// CHECK-NEXT: Size: 20
// CHECK-NEXT: StartOffset: 176
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: DefaultValue: <nullptr>
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float1x2
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: CBuffer: CB1
// CHECK-NEXT: }
// CHECK-NEXT: ID3D12ShaderReflectionConstantBuffer:
// CHECK-NEXT: D3D12_SHADER_BUFFER_DESC: Name: SB
// CHECK-NEXT: Type: D3D_CT_RESOURCE_BIND_INFO
// CHECK-NEXT: Size: 20
// CHECK-NEXT: Size: 64
// CHECK-NEXT: uFlags: 0
// CHECK-NEXT: Num Variables: 1
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: $Element
// CHECK-NEXT: Size: 20
// CHECK-NEXT: Size: 64
// CHECK-NEXT: StartOffset: 0
// CHECK-NEXT: uFlags: 0x2
// CHECK-NEXT: DefaultValue: <nullptr>
@ -77,8 +378,8 @@
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 5
// CHECK-NEXT: Members: 3
// CHECK-NEXT: Columns: 16
// CHECK-NEXT: Members: 8
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
@ -91,14 +392,43 @@
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S0
// CHECK-NEXT: Class: D3D_SVC_STRUCT
// CHECK-NEXT: Type: D3D_SVT_VOID
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 3
// CHECK-NEXT: Members: 2
// CHECK-NEXT: Offset: 4
// CHECK-NEXT: {
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 0
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 8
// CHECK-NEXT: }
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 4
// CHECK-NEXT: Offset: 16
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float3
// CHECK-NEXT: Class: D3D_SVC_VECTOR
@ -107,22 +437,82 @@
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 3
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 8
// CHECK-NEXT: Offset: 24
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int2
// CHECK-NEXT: Class: D3D_SVC_VECTOR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 36
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float2x1
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 2
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 44
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int
// CHECK-NEXT: Class: D3D_SVC_SCALAR
// CHECK-NEXT: Type: D3D_SVT_INT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 1
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 52
// CHECK-NEXT: ID3D12ShaderReflectionType:
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: float1x2
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
// CHECK-NEXT: Type: D3D_SVT_FLOAT
// CHECK-NEXT: Elements: 0
// CHECK-NEXT: Rows: 1
// CHECK-NEXT: Columns: 2
// CHECK-NEXT: Members: 0
// CHECK-NEXT: Offset: 56
// CHECK-NEXT: }
// CHECK-NEXT: CBuffer: SB
// CHECK-NEXT: }
#endif
struct S0 {
int2 i2; // CB: 0, SB: 0
float f; // CB: 8, SB: 8
};
struct S1 {
int i;
int j;
float3 c;
int i; // CB: 0, SB: 0
S0 s0; // CB: 16, SB: 4 (new row for CB)
int2 j; // CB: 32, SB: 16 (new row for CB)
float3 c; // CB: 48, SB: 24 (new row for CB)
int2 k; // CB: 64, SB: 36 (new row for CB)
float2x1 f2x1; // CB: 72, SB: 44 pack with previous
int l; // CB: 80, SB: 52
float1x2 f1x2; // CB: 96, SB: 56 (new rows for CB)
};
StructuredBuffer<S1> SB;
ConstantBuffer<S1> CB;
float3 main() : OUT {
return SB[CB.i].c;
struct S2 {
int i;
};
cbuffer CB1 {
S1 s1; // CB: 0
S2 s2; // CB: 128 (new row for struct)
S2 s3; // CB: 144 (new row for struct)
float3 c; // CB: 148 (fits into last row)
int k; // CB: 160 (new row for CB)
float2x1 f2x1; // CB: 164 pack with previous
float1x2 f1x2; // CB: 176 (new rows for multi-row matrix in col_major)
}
float3 main() : OUT {
return SB[CB.s0.i2.x + s3.i].c;
}

Просмотреть файл

@ -169,8 +169,7 @@ public:
}
void CompareType(ID3D12ShaderReflectionType *pTest,
ID3D12ShaderReflectionType *pBase,
bool shouldSuppressOffsetChecks = false)
ID3D12ShaderReflectionType *pBase)
{
D3D12_SHADER_TYPE_DESC testDesc, baseDesc;
VERIFY_SUCCEEDED(pTest->GetDesc(&testDesc));
@ -183,10 +182,7 @@ public:
VERIFY_ARE_EQUAL(testDesc.Elements, baseDesc.Elements);
VERIFY_ARE_EQUAL(testDesc.Members, baseDesc.Members);
if(!shouldSuppressOffsetChecks)
{
VERIFY_ARE_EQUAL(testDesc.Offset, baseDesc.Offset);
}
VERIFY_ARE_EQUAL(testDesc.Offset, baseDesc.Offset);
VERIFY_ARE_EQUAL(0, strcmp(testDesc.Name, baseDesc.Name));
@ -196,7 +192,7 @@ public:
VERIFY_IS_NOT_NULL(testMemberType);
VERIFY_IS_NOT_NULL(baseMemberType);
CompareType(testMemberType, baseMemberType, shouldSuppressOffsetChecks);
CompareType(testMemberType, baseMemberType);
LPCSTR testMemberName = pTest->GetMemberTypeName(i);
LPCSTR baseMemberName = pBase->GetMemberTypeName(i);
@ -297,24 +293,7 @@ public:
VERIFY_ARE_EQUAL(variableTypeMap.count(testConst.Name), 1);
ID3D12ShaderReflectionType* pBaseType = variableTypeMap[testConst.Name];
// Note: we suppress comparing offsets for structured buffers, because dxc and fxc don't
// seem to agree in that case.
//
// The information in the `D3D12_SHADER_BUFFER_DESC` doesn't give us enough to
// be able to isolate structured buffers, so we do the test negatively: suppress
// offset checks *unless* we are looking at a `cbuffer` or `tbuffer`.
bool shouldSuppressOffsetChecks = true;
switch( baseCB.Type )
{
default:
break;
case D3D_CT_CBUFFER:
case D3D_CT_TBUFFER:
shouldSuppressOffsetChecks = false;
break;
}
CompareType(pTestType, pBaseType, shouldSuppressOffsetChecks);
CompareType(pTestType, pBaseType);
}
}
}
@ -531,7 +510,6 @@ public:
}
if (FAILED(CompileFromFile(name, false, &pProgram))) {
WEX::Logging::Log::Comment(L"Failed to compile DXIL blob.");
if (ignoreIfDXBCFails) return;
VERIFY_FAIL();
}
@ -1490,6 +1468,7 @@ TEST_F(DxilContainerTest, ReflectionMatchesDXBC_CheckIn) {
WEX::TestExecution::SetVerifyOutput verifySettings(WEX::TestExecution::VerifyOutputSettings::LogOnlyFailures);
ReflectionTest(hlsl_test::GetPathToHlslDataFile(L"..\\CodeGenHLSL\\container\\SimpleBezier11DS.hlsl").c_str(), false);
ReflectionTest(hlsl_test::GetPathToHlslDataFile(L"..\\CodeGenHLSL\\container\\SubD11_SmoothPS.hlsl").c_str(), false);
ReflectionTest(hlsl_test::GetPathToHlslDataFile(L"..\\CodeGenHLSL\\batch\\misc\\d3dreflect\\structured_buffer_layout.hlsl").c_str(), false);
}
TEST_F(DxilContainerTest, ReflectionMatchesDXBC_Full) {