Update DepthStencilSamplingTests to use WGSL

Bug: dawn:572
Change-Id: I8e90175e2201250ca7e67ec955226871bdb70a97
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/32514
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Austin Eng 2020-12-22 20:03:48 +00:00 committed by Commit Bot service account
parent 600798bdb1
commit 04e3078a64
1 changed files with 88 additions and 108 deletions

View File

@ -69,47 +69,40 @@ class DepthStencilSamplingTest : public DawnTest {
wgpu::RenderPipeline CreateSamplingRenderPipeline(std::vector<TestAspect> aspects, wgpu::RenderPipeline CreateSamplingRenderPipeline(std::vector<TestAspect> aspects,
uint32_t componentIndex) { uint32_t componentIndex) {
wgpu::ShaderModule vsModule = wgpu::ShaderModule vsModule = utils::CreateShaderModuleFromWGSL(device, R"(
utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"( [[builtin(position)]] var<out> Position : vec4<f32>;
#version 450 [[stage(vertex)]] fn main() -> void {
void main() { Position = vec4<f32>(0.0, 0.0, 0.0, 1.0);
gl_Position = vec4(0.f, 0.f, 0.f, 1.f); })");
gl_PointSize = 1.0;
}
)");
utils::ComboRenderPipelineDescriptor pipelineDescriptor(device); utils::ComboRenderPipelineDescriptor pipelineDescriptor(device);
std::ostringstream shaderSource; std::ostringstream shaderSource;
std::ostringstream shaderBody; std::ostringstream shaderBody;
shaderSource << R"(
#version 450
layout(set = 0, binding = 0) uniform sampler samp;
)";
uint32_t index = 0; uint32_t index = 0;
for (TestAspect aspect : aspects) { for (TestAspect aspect : aspects) {
switch (aspect) { switch (aspect) {
case TestAspect::Depth: case TestAspect::Depth:
shaderSource << "layout(set = 0, binding = " << 1 + index shaderSource << "[[set(0), binding(" << index << ")]] var<uniform_constant> tex"
<< ") uniform texture2D tex" << index << ";\n"; << index << " : texture_2d<f32>;\n";
shaderSource << "layout(location = " << index << ") out float result" << index shaderSource << "[[location(" << index << ")]] var<out> result" << index
<< ";\n"; << " : f32;\n";
shaderBody << "result" << index << " = texture(sampler2D(tex" << index shaderBody << "\nresult" << index << " = textureLoad(tex" << index
<< ", samp), vec2(0.5, 0.5))[" << componentIndex << "];\n"; << ", vec2<i32>(0, 0), 0)[" << componentIndex << "];\n";
pipelineDescriptor.cColorStates[index].format = wgpu::TextureFormat::R32Float; pipelineDescriptor.cColorStates[index].format = wgpu::TextureFormat::R32Float;
break; break;
case TestAspect::Stencil: case TestAspect::Stencil:
shaderSource << "layout(set = 0, binding = " << 1 + index shaderSource << "[[set(0), binding(" << index << ")]] var<uniform_constant> tex"
<< ") uniform utexture2D tex" << index << ";\n"; << index << " : texture_2d<u32>;\n";
shaderSource << "layout(location = " << index << ") out uint result" << index shaderSource << "[[location(" << index << ")]] var<out> result" << index
<< ";\n"; << " : u32;\n";
shaderBody << "result" << index << " = texelFetch(usampler2D(tex" << index shaderBody << "\nresult" << index << " = textureLoad(tex" << index
<< ", samp), ivec2(0, 0), 0)[" << componentIndex << "];\n"; << ", vec2<i32>(0, 0), 0)[" << componentIndex << "];\n";
pipelineDescriptor.cColorStates[index].format = wgpu::TextureFormat::R8Uint; pipelineDescriptor.cColorStates[index].format = wgpu::TextureFormat::R8Uint;
break; break;
} }
@ -117,10 +110,10 @@ class DepthStencilSamplingTest : public DawnTest {
index++; index++;
} }
shaderSource << "void main() { " << shaderBody.str() << " }"; shaderSource << "[[stage(fragment)]] fn main() -> void { " << shaderBody.str() << "\n}";
wgpu::ShaderModule fsModule = utils::CreateShaderModule( wgpu::ShaderModule fsModule =
device, utils::SingleShaderStage::Fragment, shaderSource.str().c_str()); utils::CreateShaderModuleFromWGSL(device, shaderSource.str().c_str());
pipelineDescriptor.vertexStage.module = vsModule; pipelineDescriptor.vertexStage.module = vsModule;
pipelineDescriptor.cFragmentStage.module = fsModule; pipelineDescriptor.cFragmentStage.module = fsModule;
pipelineDescriptor.primitiveTopology = wgpu::PrimitiveTopology::PointList; pipelineDescriptor.primitiveTopology = wgpu::PrimitiveTopology::PointList;
@ -134,46 +127,50 @@ class DepthStencilSamplingTest : public DawnTest {
std::ostringstream shaderSource; std::ostringstream shaderSource;
std::ostringstream shaderBody; std::ostringstream shaderBody;
shaderSource << R"( shaderSource << R"(
#version 450 [[block]] struct DepthResult {
layout(set = 0, binding = 0) uniform sampler samp; [[offset(0)]] value : f32;
)"; };
[[block]] struct StencilResult {
[[offset(0)]] value : u32;
};)";
shaderSource << "\n";
uint32_t index = 0; uint32_t index = 0;
for (TestAspect aspect : aspects) { for (TestAspect aspect : aspects) {
switch (aspect) { switch (aspect) {
case TestAspect::Depth: case TestAspect::Depth:
shaderSource << "layout(set = 0, binding = " << 1 + 2 * index shaderSource << "[[set(0), binding(" << 2 * index
<< ") uniform texture2D tex" << index << ";\n"; << ")]] var<uniform_constant> tex" << index
<< " : texture_2d<f32>;\n";
shaderSource << "layout(set = 0, binding = " << 1 + 2 * index + 1 shaderSource << "[[set(0), binding(" << 2 * index + 1
<< ") writeonly buffer Result" << index << " {\n" << ")]] var<storage_buffer> result" << index
<< " float result" << index << ";\n" << " : DepthResult;\n";
<< "};\n";
shaderBody << "result" << index << " = texture(sampler2D(tex" << index shaderBody << "\nresult" << index << ".value = textureLoad(tex" << index
<< ", samp), vec2(0.5, 0.5))[" << componentIndex << "];\n"; << ", vec2<i32>(0, 0), 0)[" << componentIndex << "];";
break; break;
case TestAspect::Stencil: case TestAspect::Stencil:
shaderSource << "layout(set = 0, binding = " << 1 + 2 * index shaderSource << "[[set(0), binding(" << 2 * index
<< ") uniform utexture2D tex" << index << ";\n"; << ")]] var<uniform_constant> tex" << index
<< " : texture_2d<u32>;\n";
shaderSource << "layout(set = 0, binding = " << 1 + 2 * index + 1 shaderSource << "[[set(0), binding(" << 2 * index + 1
<< ") writeonly buffer Result" << index << " {\n" << ")]] var<storage_buffer> result" << index
<< " uint result" << index << ";\n" << " : StencilResult;\n";
<< "};\n";
shaderBody << "result" << index << " = texelFetch(usampler2D(tex" << index shaderBody << "\nresult" << index << ".value = textureLoad(tex" << index
<< ", samp), ivec2(0, 0), 0)[" << componentIndex << "];\n"; << ", vec2<i32>(0, 0), 0)[" << componentIndex << "];";
break; break;
} }
index++; index++;
} }
shaderSource << "void main() { " << shaderBody.str() << " }"; shaderSource << "[[stage(compute)]] fn main() -> void { " << shaderBody.str() << "\n}";
wgpu::ShaderModule csModule = utils::CreateShaderModule( wgpu::ShaderModule csModule =
device, utils::SingleShaderStage::Compute, shaderSource.str().c_str()); utils::CreateShaderModuleFromWGSL(device, shaderSource.str().c_str());
wgpu::ComputePipelineDescriptor pipelineDescriptor; wgpu::ComputePipelineDescriptor pipelineDescriptor;
pipelineDescriptor.computeStage.module = csModule; pipelineDescriptor.computeStage.module = csModule;
@ -183,30 +180,25 @@ class DepthStencilSamplingTest : public DawnTest {
} }
wgpu::RenderPipeline CreateComparisonRenderPipeline() { wgpu::RenderPipeline CreateComparisonRenderPipeline() {
wgpu::ShaderModule vsModule = wgpu::ShaderModule vsModule = utils::CreateShaderModuleFromWGSL(device, R"(
utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"( [[builtin(position)]] var<out> Position : vec4<f32>;
#version 450 [[stage(vertex)]] fn main() -> void {
void main() { Position = vec4<f32>(0.0, 0.0, 0.0, 1.0);
gl_Position = vec4(0.f, 0.f, 0.f, 1.f); })");
gl_PointSize = 1.0;
}
)");
wgpu::ShaderModule fsModule = wgpu::ShaderModule fsModule = utils::CreateShaderModuleFromWGSL(device, R"(
utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"( [[set(0), binding(0)]] var<uniform_constant> samp : sampler_comparison;
#version 450 [[set(0), binding(1)]] var<uniform_constant> tex : texture_depth_2d;
layout(set = 0, binding = 0) uniform samplerShadow samp; [[block]] struct Uniforms {
layout(set = 0, binding = 1) uniform texture2D tex; [[offset(0)]] compareRef : f32;
layout(set = 0, binding = 2) uniform Uniforms { };
float compareRef; [[set(0), binding(2)]] var<uniform> uniforms : Uniforms;
};
layout(location = 0) out float samplerResult; [[location(0)]] var<out> samplerResult : f32;
void main() { [[stage(fragment)]] fn main() -> void {
samplerResult = texture(sampler2DShadow(tex, samp), vec3(0.5, 0.5, compareRef)); samplerResult = textureSampleCompare(tex, samp, vec2<f32>(0.5, 0.5), uniforms.compareRef);
} })");
)");
// TODO(dawn:367): Cannot use GetBindGroupLayout for comparison samplers without shader // TODO(dawn:367): Cannot use GetBindGroupLayout for comparison samplers without shader
// reflection data. // reflection data.
@ -226,22 +218,22 @@ class DepthStencilSamplingTest : public DawnTest {
} }
wgpu::ComputePipeline CreateComparisonComputePipeline() { wgpu::ComputePipeline CreateComparisonComputePipeline() {
wgpu::ShaderModule csModule = wgpu::ShaderModule csModule = utils::CreateShaderModuleFromWGSL(device, R"(
utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"( [[set(0), binding(0)]] var<uniform_constant> samp : sampler_comparison;
#version 450 [[set(0), binding(1)]] var<uniform_constant> tex : texture_depth_2d;
layout(set = 0, binding = 0) uniform samplerShadow samp; [[block]] struct Uniforms {
layout(set = 0, binding = 1) uniform texture2D tex; [[offset(0)]] compareRef : f32;
layout(set = 0, binding = 2) uniform Uniforms { };
float compareRef; [[set(0), binding(2)]] var<uniform> uniforms : Uniforms;
};
layout(set = 0, binding = 3) writeonly buffer SamplerResult {
float samplerResult;
};
void main() { [[block]] struct SamplerResult {
samplerResult = texture(sampler2DShadow(tex, samp), vec3(0.5, 0.5, compareRef)); [[offset(0)]] value : f32;
} };
)"); [[set(0), binding(3)]] var<storage_buffer> samplerResult : SamplerResult;
[[stage(compute)]] fn main() -> void {
samplerResult.value = textureSampleCompare(tex, samp, vec2<f32>(0.5, 0.5), uniforms.compareRef);
})");
// TODO(dawn:367): Cannot use GetBindGroupLayout without shader reflection data. // TODO(dawn:367): Cannot use GetBindGroupLayout without shader reflection data.
wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout( wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
@ -310,9 +302,6 @@ class DepthStencilSamplingTest : public DawnTest {
std::vector<T> expectedValues) { std::vector<T> expectedValues) {
ASSERT(textureValues.size() == expectedValues.size()); ASSERT(textureValues.size() == expectedValues.size());
wgpu::SamplerDescriptor samplerDesc;
wgpu::Sampler sampler = device.CreateSampler(&samplerDesc);
wgpu::Texture outputTexture; wgpu::Texture outputTexture;
wgpu::Texture inputTexture = CreateInputTexture(format); wgpu::Texture inputTexture = CreateInputTexture(format);
wgpu::TextureViewDescriptor inputViewDesc = {}; wgpu::TextureViewDescriptor inputViewDesc = {};
@ -327,12 +316,8 @@ class DepthStencilSamplingTest : public DawnTest {
break; break;
} }
wgpu::BindGroup bindGroup = wgpu::BindGroup bindGroup = utils::MakeBindGroup(
utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0), device, pipeline.GetBindGroupLayout(0), {{0, inputTexture.CreateView(&inputViewDesc)}});
{
{0, sampler},
{1, inputTexture.CreateView(&inputViewDesc)},
});
for (size_t i = 0; i < textureValues.size(); ++i) { for (size_t i = 0; i < textureValues.size(); ++i) {
// Set the input depth texture to the provided texture value // Set the input depth texture to the provided texture value
@ -371,9 +356,6 @@ class DepthStencilSamplingTest : public DawnTest {
std::vector<T> expectedValues) { std::vector<T> expectedValues) {
ASSERT(textureValues.size() == expectedValues.size()); ASSERT(textureValues.size() == expectedValues.size());
wgpu::SamplerDescriptor samplerDesc;
wgpu::Sampler sampler = device.CreateSampler(&samplerDesc);
wgpu::Texture inputTexture = CreateInputTexture(format); wgpu::Texture inputTexture = CreateInputTexture(format);
wgpu::TextureViewDescriptor inputViewDesc = {}; wgpu::TextureViewDescriptor inputViewDesc = {};
switch (aspect) { switch (aspect) {
@ -387,9 +369,9 @@ class DepthStencilSamplingTest : public DawnTest {
wgpu::Buffer outputBuffer = CreateOutputBuffer(); wgpu::Buffer outputBuffer = CreateOutputBuffer();
wgpu::BindGroup bindGroup = utils::MakeBindGroup( wgpu::BindGroup bindGroup =
device, pipeline.GetBindGroupLayout(0), utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0),
{{0, sampler}, {1, inputTexture.CreateView(&inputViewDesc)}, {2, outputBuffer}}); {{0, inputTexture.CreateView(&inputViewDesc)}, {1, outputBuffer}});
for (size_t i = 0; i < textureValues.size(); ++i) { for (size_t i = 0; i < textureValues.size(); ++i) {
// Set the input depth texture to the provided texture value // Set the input depth texture to the provided texture value
@ -644,9 +626,8 @@ TEST_P(DepthStencilSamplingTest, SampleDepthAndStencilRender) {
wgpu::BindGroup bindGroup = wgpu::BindGroup bindGroup =
utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0), utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0),
{ {
{0, sampler}, {0, inputTexture.CreateView(&depthViewDesc)},
{1, inputTexture.CreateView(&depthViewDesc)}, {1, inputTexture.CreateView(&stencilViewDesc)},
{2, inputTexture.CreateView(&stencilViewDesc)},
}); });
wgpu::Texture depthOutput = CreateOutputTexture(wgpu::TextureFormat::R32Float); wgpu::Texture depthOutput = CreateOutputTexture(wgpu::TextureFormat::R32Float);
@ -691,11 +672,10 @@ TEST_P(DepthStencilSamplingTest, SampleDepthAndStencilRender) {
wgpu::BindGroup bindGroup = wgpu::BindGroup bindGroup =
utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0), utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0),
{{0, sampler}, {{0, inputTexture.CreateView(&depthViewDesc)},
{1, inputTexture.CreateView(&depthViewDesc)}, {1, depthOutput},
{2, depthOutput}, {2, inputTexture.CreateView(&stencilViewDesc)},
{3, inputTexture.CreateView(&stencilViewDesc)}, {3, stencilOutput}});
{4, stencilOutput}});
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
// Initialize both depth and stencil aspects. // Initialize both depth and stencil aspects.