Fix for struct with undound members
This commit is contained in:
5
expr.cpp
5
expr.cpp
@@ -6784,9 +6784,12 @@ lUniformValueToVarying(FunctionEmitContext *ctx, llvm::Value *value,
|
||||
type->GetAsVaryingType()->LLVMType(g->ctx);
|
||||
llvm::Value *retValue = llvm::UndefValue::get(llvmType);
|
||||
|
||||
const StructType *structType = CastType<StructType>(type->GetAsVaryingType());
|
||||
|
||||
for (int i = 0; i < collectionType->GetElementCount(); ++i) {
|
||||
llvm::Value *v = ctx->ExtractInst(value, i, "get_element");
|
||||
if (collectionType->GetElementType(i)->IsVaryingType())
|
||||
// If struct has "bound uniform" member, we don't need to cast it to varying
|
||||
if (!(structType != NULL && structType->GetElementType(i)->IsUniformType()))
|
||||
v = lUniformValueToVarying(ctx, v, collectionType->GetElementType(i));
|
||||
retValue = ctx->InsertInst(retValue, v, i, "set_element");
|
||||
}
|
||||
|
||||
21
tests/struct-test-128.ispc
Normal file
21
tests/struct-test-128.ispc
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
struct Foo {
|
||||
float x;
|
||||
};
|
||||
|
||||
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
|
||||
float a = aFOO[programIndex];
|
||||
uniform Foo struct_1;
|
||||
struct_1.x = b;
|
||||
varying Foo struct_2 = struct_1;
|
||||
RET[programIndex] = struct_2.x;
|
||||
}
|
||||
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 5;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user