AcademySoftwareFoundation / AcademySoftwareFoundation/OpenShadingLanguage

problem with integer geometry attributes and batched shader execution

Open
#1,929 6 comments 0 reactions 1 assignee Claimed by @AlexMWells View on GitHub
batch shading
Dominant language
C++
Stars
2.3k
Forks
414
Avg merge
3d 1h
Merged PRs (30d)
10

Description

I'm seeing a problem with batched execution that I've managed to distill to the repro case below with `testshade`. Basically, if I have an integer geometry attribute, then batched OSL execution seems to disregard what the renderer writes to the destination depending on what the default value is specified in the shader. For eample, suppose I have a shader with the following parameter declaration, `int face_idx = 0 [[int lockgeom=0]]`, the value returned by the renderer doesn't make it to the shader. But in this case it does: `face_idx = 2 [[int lockgeom=0]]`. FWIW, a value of '1' also fails.

This is based on OSL-v1.14.2.0 which goes dates back to September so it's possible this has been fixed?

Here's my example shader:

```c
shader example(int face_idx = 0 [[int lockgeom = 0]],
output color dst = 0)
{
dst = color(face_idx * 0.25, 0, 0);
}
```

A patch to add the `face_idx` user-data to batched `testshade`:
```c++
diff --git a/src/testshade/batched_simplerend.cpp b/src/testshade/batched_simplerend.cpp
index ea2acbdf..6618fba7 100644
--- a/src/testshade/batched_simplerend.cpp
+++ b/src/testshade/batched_simplerend.cpp
@@ -21,6 +21,7 @@ struct UniqueStringCache {
, red("red")
, green("green")
, blue("blue")
+ , face_idx("face_idx")
, lookupTable("lookupTable")
, blahblah("blahblah")
, options("options")
@@ -51,6 +52,7 @@ struct UniqueStringCache {
ustring red;
ustring green;
ustring blue;
+ ustring face_idx;
ustring lookupTable;
ustring blahblah;
ustring options;
@@ -663,7 +665,17 @@ BatchedSimpleRenderer::get_userdata(ustringhash name,

// For testing of interactions with default values
// may not provide data for all lanes
- if (name == ucache().s && Masked::is(val)) {
+ if (name == ucache().face_idx && Masked::is(val)) {
+ printf("found face_idx!\n");
+ Masked out(val);
+ for (int i = 0; i < WidthT; ++i) {
+ if (out[i].is_on()) {
+ out[i] = int(4 * bsg->varying.u[i]);
+ }
+ }
+ return out.mask();
+ }
+ else if (name == ucache().s && Masked::is(val)) {
Masked out(val);
for (int i = 0; i < WidthT; ++i) {
// NOTE: assigning to out[i] will mask by itself
```

Command line:
`env TESTSHADE_BATCH_SIZE=16 testshade --batched --res 256 256 -o dst output.exr example`

Here are the images I get:

With `face_idx = 0 [[in lockgeom=0]]` I get the wrong image:

![Image](https://github.com/user-attachments/assets/60818533-d50a-4d16-b161-0d33d4e7f938)

With `face_idx = 2 [[in lockgeom=0]]` I get the expected image:

![Image](https://github.com/user-attachments/assets/45828bfb-7622-47a6-aef8-a8effc00e629)

Is anyone able to reproduce this?

Thanks!

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.