Skip to content

Commit be73c33

Browse files
Fix issue with closure keyparams batched (#1619)
When evaluating varying closure keyword parameters in batched execution, the value of the first lane in the batch would be used for the whole batch.
1 parent bd7fd4c commit be73c33

File tree

3 files changed

+72
-6
lines changed

3 files changed

+72
-6
lines changed

src/liboslexec/batched_llvm_gen.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7064,7 +7064,7 @@ LLVMGEN(llvm_gen_spline)
70647064
static void
70657065
llvm_gen_keyword_fill(BatchedBackendLLVM& rop, Opcode& op,
70667066
const ClosureRegistry::ClosureEntry* clentry,
7067-
ustring clname, llvm::Value* mem_void_ptr, int argsoffset)
7067+
ustring clname, llvm::Value* mem_void_ptr, int argsoffset, int lane_index)
70687068
{
70697069
OSL_DASSERT(((op.nargs() - argsoffset) % 2) == 0);
70707070

@@ -7088,10 +7088,43 @@ llvm_gen_keyword_fill(BatchedBackendLLVM& rop, Opcode& op,
70887088
if (equivalent(p.type, ValueType) && !strcmp(key->c_str(), p.key)) {
70897089
// store data
70907090
OSL_DASSERT(p.offset + p.field_size <= clentry->struct_size);
7091-
llvm::Value* dst = rop.ll.offset_ptr(mem_void_ptr, p.offset);
7092-
llvm::Value* src = rop.llvm_void_ptr(Value);
7093-
rop.ll.op_memcpy(dst, src, (int)p.type.size(),
7094-
4 /* use 4 byte alignment for now */);
7091+
7092+
bool arg_is_uniform = Value.is_uniform();
7093+
7094+
TypeDesc simpletype(Value.typespec().simpletype());
7095+
int num_elements = simpletype.numelements();
7096+
int num_components = simpletype.aggregate;
7097+
7098+
llvm::Value* dest_base = rop.ll.offset_ptr(mem_void_ptr, p.offset);
7099+
dest_base = rop.llvm_ptr_cast(dest_base, p.type);
7100+
7101+
for (int a = 0; a < num_elements; ++a) {
7102+
llvm::Value* arrind = simpletype.arraylen ? rop.ll.constant(a)
7103+
: NULL;
7104+
for (int c = 0; c < num_components; c++) {
7105+
llvm::Value* dest_elem;
7106+
if (num_components > 1)
7107+
dest_elem = rop.ll.GEP(dest_base, a, c);
7108+
else
7109+
dest_elem = dest_base;
7110+
7111+
// NOTE: We don't want any uniform arguments to be
7112+
// widened, so our typical op_is_uniform doesn't do what we
7113+
// want for this when loading. So just pass arg_is_uniform
7114+
// which will avoid widening any uniform arguments.
7115+
llvm::Value* loaded
7116+
= rop.llvm_load_value(Value, 0, arrind, c,
7117+
TypeDesc::UNKNOWN,
7118+
/*op_is_uniform*/ arg_is_uniform,
7119+
/*index_is_uniform*/ true);
7120+
7121+
if (!arg_is_uniform) {
7122+
loaded = rop.ll.op_extract(loaded, lane_index);
7123+
}
7124+
rop.ll.op_unmasked_store(loaded, dest_elem);
7125+
}
7126+
}
7127+
70957128
legal = true;
70967129
break;
70977130
}
@@ -7275,7 +7308,7 @@ LLVMGEN(llvm_gen_closure)
72757308
}
72767309

72777310
llvm_gen_keyword_fill(rop, op, clentry, closure_name, mem_void_ptr,
7278-
2 + weighted + clentry->nformal);
7311+
2 + weighted + clentry->nformal, lane_index);
72797312

72807313
if (next_block)
72817314
rop.ll.op_branch(next_block);

testsuite/closure/ref/out.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ adding holdout: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second"
2020
+ (1, 1, 1) * emission ()
2121
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
2222
+ (0.5, 0.5, 0.5) * holdout ()
23+
adding varying keyword parameter: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second")
24+
+ (0.25, 0.25, 0.25) * phong ((0, 0, 1), 20, "label", "one")
25+
+ (0.5, 0.5, 0.5) * transparent ()
26+
+ (1, 1, 1) * emission ()
27+
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
28+
+ (0.5, 0.5, 0.5) * holdout ()
29+
+ (1, 1, 1) * diffuse ((0, 0, 1), "label", "0.000000")
2330
Ci = (0.5, 0.5, 0.5) * diffuse ((0, 0, 1), "label", "second")
2431
adding specular term: Ci = (0.5, 0.5, 0.5) * diffuse ((0, 0, 1), "label", "second")
2532
+ (0.5, 0.5, 0.5) * phong ((0, 0, 1), 20, "label", "one")
@@ -41,6 +48,13 @@ adding holdout: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second"
4148
+ (1, 1, 1) * emission ()
4249
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
4350
+ (0.5, 0.5, 0.5) * holdout ()
51+
adding varying keyword parameter: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second")
52+
+ (0.25, 0.25, 0.25) * phong ((0, 0, 1), 20, "label", "one")
53+
+ (0.5, 0.5, 0.5) * transparent ()
54+
+ (1, 1, 1) * emission ()
55+
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
56+
+ (0.5, 0.5, 0.5) * holdout ()
57+
+ (1, 1, 1) * diffuse ((0, 0, 1), "label", "1.000000")
4458
Ci = (0.5, 0.5, 0.5) * diffuse ((0, 0, 1), "label", "second")
4559
adding specular term: Ci = (0.5, 0.5, 0.5) * diffuse ((0, 0, 1), "label", "second")
4660
+ (0.5, 0.5, 0.5) * phong ((0, 0, 1), 20, "label", "one")
@@ -62,6 +76,13 @@ adding holdout: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second"
6276
+ (1, 1, 1) * emission ()
6377
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
6478
+ (0.5, 0.5, 0.5) * holdout ()
79+
adding varying keyword parameter: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second")
80+
+ (0.25, 0.25, 0.25) * phong ((0, 0, 1), 20, "label", "one")
81+
+ (0.5, 0.5, 0.5) * transparent ()
82+
+ (1, 1, 1) * emission ()
83+
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
84+
+ (0.5, 0.5, 0.5) * holdout ()
85+
+ (1, 1, 1) * diffuse ((0, 0, 1), "label", "0.000000")
6586
Ci = (0.5, 0.5, 0.5) * diffuse ((0, 0, 1), "label", "second")
6687
adding specular term: Ci = (0.5, 0.5, 0.5) * diffuse ((0, 0, 1), "label", "second")
6788
+ (0.5, 0.5, 0.5) * phong ((0, 0, 1), 20, "label", "one")
@@ -83,4 +104,11 @@ adding holdout: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second"
83104
+ (1, 1, 1) * emission ()
84105
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
85106
+ (0.5, 0.5, 0.5) * holdout ()
107+
adding varying keyword parameter: Ci = (0.25, 0.25, 0.25) * diffuse ((0, 0, 1), "label", "second")
108+
+ (0.25, 0.25, 0.25) * phong ((0, 0, 1), 20, "label", "one")
109+
+ (0.5, 0.5, 0.5) * transparent ()
110+
+ (1, 1, 1) * emission ()
111+
+ (0.25, 0.25, 0.25) * debug ("MyAOV")
112+
+ (0.5, 0.5, 0.5) * holdout ()
113+
+ (1, 1, 1) * diffuse ((0, 0, 1), "label", "1.000000")
86114

testsuite/closure/test.osl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ test (float Kd = 0.5, float Ks = 0.5, float exponent = 20, color opacity = 0.5,
3535
Ci += 0.5 * holdout();
3636
printf (" Ci = %s\n", Ci);
3737

38+
// add varying keyword parameter
39+
printf ("adding varying keyword parameter:");
40+
Ci += diffuse( N, "label", format( "%f", u ) );
41+
printf (" Ci = %s\n", Ci);
42+
3843
closure color xclosure = 0;
3944
xclosure = 0;
4045
}

0 commit comments

Comments
 (0)