Skip to content

Commit dcc3af7

Browse files
authored
CUDA/CPU support for 1D, 2D, CubeArray (shader-slang#1232)
* CUDA support for array of resources. * * Add support for Texture2DArray on CPU * Expand texture-simple.slang to test Texture2DArray * Reorganise CUDAComputeUtil to split out createTextureResource. * Add TextureCubeArray support for CPU/CUDA targets.
1 parent 788556a commit dcc3af7

6 files changed

+537
-297
lines changed

prelude/slang-cpp-types.h

+32
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,38 @@ struct Texture1DArray
311311
ITexture1DArray* texture;
312312
};
313313

314+
struct ITexture2DArray
315+
{
316+
virtual void Load(const int4& v, void* out) = 0;
317+
virtual void Sample(SamplerState samplerState, const float3& loc, void* out) = 0;
318+
virtual void SampleLevel(SamplerState samplerState, const float3& loc, float level, void* out) = 0;
319+
};
320+
321+
template <typename T>
322+
struct Texture2DArray
323+
{
324+
T Load(const int4& v) const { T out; texture->Load(v, &out); return out; }
325+
T Sample(SamplerState samplerState, const float3& v) const { T out; texture->Sample(samplerState, v, &out); return out; }
326+
T SampleLevel(SamplerState samplerState, const float3& v, float level) { T out; texture->SampleLevel(samplerState, v, level, &out); return out; }
327+
328+
ITexture2DArray* texture;
329+
};
330+
331+
struct ITextureCubeArray
332+
{
333+
virtual void Sample(SamplerState samplerState, const float4& loc, void* out) = 0;
334+
virtual void SampleLevel(SamplerState samplerState, const float4& loc, float level, void* out) = 0;
335+
};
336+
337+
template <typename T>
338+
struct TextureCubeArray
339+
{
340+
T Sample(SamplerState samplerState, const float4& v) const { T out; texture->Sample(samplerState, v, &out); return out; }
341+
T SampleLevel(SamplerState samplerState, const float4& v, float level) { T out; texture->SampleLevel(samplerState, v, level, &out); return out; }
342+
343+
ITextureCubeArray* texture;
344+
};
345+
314346
/* Varying input for Compute */
315347

316348
/* Used when running a single thread */

tests/compute/texture-simple.slang

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ TextureCube<float> tCube;
1717

1818
//TEST_INPUT: Texture1D(size=4, content = one, arrayLength=2):name t1DArray
1919
Texture1DArray<float> t1DArray;
20+
//TEST_INPUT: Texture2D(size=4, content = one, arrayLength=2):name t2DArray
21+
Texture2DArray<float> t2DArray;
22+
//TEST_INPUT: TextureCube(size=4, content = one, arrayLength=2):name tCubeArray
23+
TextureCubeArray<float> tCubeArray;
2024

2125
//TEST_INPUT: Sampler:name samplerState
2226
SamplerState samplerState;
@@ -37,6 +41,8 @@ void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
3741
val += tCube.SampleLevel(samplerState, normalize(float3(u, 1 - u, u)), 0);
3842

3943
val += t1DArray.SampleLevel(samplerState, float2(u, 0), 0);
44+
val += t2DArray.SampleLevel(samplerState, float3(u, u, 0), 0);
45+
val += tCubeArray.SampleLevel(samplerState, float4(u, u, u, 0), 0);
4046

4147
outputBuffer[idx] = val;
4248
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
40A00000
2-
40A00000
3-
40A00000
4-
40A00000
1+
40E00000
2+
40E00000
3+
40E00000
4+
40E00000

tools/render-test/cpu-compute-util.cpp

+90
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,71 @@ struct ValueTexture1DArray : public CPUComputeUtil::Resource, public CPPPrelude:
182182
float m_value;
183183
};
184184

185+
template <int COUNT>
186+
struct ValueTexture2DArray : public CPUComputeUtil::Resource, public CPPPrelude::ITexture2DArray
187+
{
188+
void set(void* out)
189+
{
190+
float* dst = (float*)out;
191+
for (int i = 0; i < COUNT; ++i)
192+
{
193+
dst[i] = m_value;
194+
}
195+
}
196+
197+
virtual void Load(const CPPPrelude::int4& v, void* out) SLANG_OVERRIDE
198+
{
199+
set(out);
200+
}
201+
virtual void Sample(CPPPrelude::SamplerState samplerState, const CPPPrelude::float3& loc, void* out) SLANG_OVERRIDE
202+
{
203+
set(out);
204+
}
205+
virtual void SampleLevel(CPPPrelude::SamplerState samplerState, const CPPPrelude::float3& loc, float level, void* out) SLANG_OVERRIDE
206+
{
207+
set(out);
208+
}
209+
210+
ValueTexture2DArray(float value) :
211+
m_value(value)
212+
{
213+
m_interface = static_cast<CPPPrelude::ITexture2DArray*>(this);
214+
}
215+
216+
float m_value;
217+
};
218+
219+
220+
template <int COUNT>
221+
struct ValueTextureCubeArray : public CPUComputeUtil::Resource, public CPPPrelude::ITextureCubeArray
222+
{
223+
void set(void* out)
224+
{
225+
float* dst = (float*)out;
226+
for (int i = 0; i < COUNT; ++i)
227+
{
228+
dst[i] = m_value;
229+
}
230+
}
231+
232+
virtual void Sample(CPPPrelude::SamplerState samplerState, const CPPPrelude::float4& loc, void* out) SLANG_OVERRIDE
233+
{
234+
set(out);
235+
}
236+
virtual void SampleLevel(CPPPrelude::SamplerState samplerState, const CPPPrelude::float4& loc, float level, void* out) SLANG_OVERRIDE
237+
{
238+
set(out);
239+
}
240+
241+
ValueTextureCubeArray(float value) :
242+
m_value(value)
243+
{
244+
m_interface = static_cast<CPPPrelude::ITextureCubeArray*>(this);
245+
}
246+
247+
float m_value;
248+
};
249+
185250
static CPUComputeUtil::Resource* _newValueTexture(SlangResourceShape shape, int elemCount, float value)
186251
{
187252
switch (shape)
@@ -243,6 +308,31 @@ static CPUComputeUtil::Resource* _newValueTexture(SlangResourceShape shape, int
243308
}
244309
break;
245310
}
311+
case SLANG_TEXTURE_2D_ARRAY:
312+
{
313+
switch (elemCount)
314+
{
315+
case 1: return new ValueTexture2DArray<1>(value);
316+
case 2: return new ValueTexture2DArray<2>(value);
317+
case 3: return new ValueTexture2DArray<3>(value);
318+
case 4: return new ValueTexture2DArray<4>(value);
319+
default: break;
320+
}
321+
break;
322+
}
323+
case SLANG_TEXTURE_CUBE_ARRAY:
324+
{
325+
switch (elemCount)
326+
{
327+
case 1: return new ValueTextureCubeArray<1>(value);
328+
case 2: return new ValueTextureCubeArray<2>(value);
329+
case 3: return new ValueTextureCubeArray<3>(value);
330+
case 4: return new ValueTextureCubeArray<4>(value);
331+
default: break;
332+
}
333+
break;
334+
}
335+
246336

247337
default: break;
248338
}

0 commit comments

Comments
 (0)