Add ComputeLog2 test
BUG=chromium:1046622 Change-Id: Ic554190ed95efbd555472db95cbbd9aed66a950d Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/39961 Commit-Queue: Ryan Harrison <rharrison@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org> Auto-Submit: Ryan Harrison <rharrison@chromium.org>
This commit is contained in:
parent
1b9bcfc47d
commit
474680c5c6
|
@ -320,6 +320,7 @@ source_set("dawn_end2end_tests_sources") {
|
||||||
"end2end/SamplerTests.cpp",
|
"end2end/SamplerTests.cpp",
|
||||||
"end2end/ScissorTests.cpp",
|
"end2end/ScissorTests.cpp",
|
||||||
"end2end/ShaderFloat16Tests.cpp",
|
"end2end/ShaderFloat16Tests.cpp",
|
||||||
|
"end2end/ShaderTests.cpp",
|
||||||
"end2end/StorageTextureTests.cpp",
|
"end2end/StorageTextureTests.cpp",
|
||||||
"end2end/SubresourceRenderAttachmentTests.cpp",
|
"end2end/SubresourceRenderAttachmentTests.cpp",
|
||||||
"end2end/TextureFormatTests.cpp",
|
"end2end/TextureFormatTests.cpp",
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
// Copyright 2021 The Dawn Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "tests/DawnTest.h"
|
||||||
|
|
||||||
|
#include "tests/DawnTest.h"
|
||||||
|
#include "utils/WGPUHelpers.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class ShaderTests : public DawnTest {};
|
||||||
|
|
||||||
|
// Test that log2 is being properly calculated, base on crbug.com/1046622
|
||||||
|
TEST_P(ShaderTests, ComputeLog2) {
|
||||||
|
// TODO(crbug.com/dawn/663): log2(32) is currently being incorrectly calculated.
|
||||||
|
DAWN_SKIP_TEST_IF(IsMacOS() && IsIntel());
|
||||||
|
|
||||||
|
uint32_t const kSteps = 19;
|
||||||
|
std::vector<uint32_t> data(kSteps, 0);
|
||||||
|
std::vector<uint32_t> expected{0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 32};
|
||||||
|
uint64_t bufferSize = static_cast<uint64_t>(data.size() * sizeof(uint32_t));
|
||||||
|
wgpu::Buffer buffer = utils::CreateBufferFromData(
|
||||||
|
device, data.data(), bufferSize, wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopySrc);
|
||||||
|
|
||||||
|
std::string shader = R"(
|
||||||
|
[[block]] struct Buf {
|
||||||
|
[[offset(0)]] data : [[stride(4)]] array<u32, 19>;
|
||||||
|
};
|
||||||
|
|
||||||
|
[[group(0), binding(0)]] var<storage_buffer> buf : [[access(read_write)]] Buf;
|
||||||
|
|
||||||
|
[[stage(compute)]] fn main() -> void {
|
||||||
|
buf.data[0] = u32(log2(1.0));
|
||||||
|
buf.data[1] = u32(log2(2.0));
|
||||||
|
buf.data[2] = u32(log2(3.0));
|
||||||
|
buf.data[3] = u32(log2(4.0));
|
||||||
|
buf.data[4] = u32(log2(7.0));
|
||||||
|
buf.data[5] = u32(log2(8.0));
|
||||||
|
buf.data[6] = u32(log2(15.0));
|
||||||
|
buf.data[7] = u32(log2(16.0));
|
||||||
|
buf.data[8] = u32(log2(31.0));
|
||||||
|
buf.data[9] = u32(log2(32.0));
|
||||||
|
buf.data[10] = u32(log2(63.0));
|
||||||
|
buf.data[11] = u32(log2(64.0));
|
||||||
|
buf.data[12] = u32(log2(127.0));
|
||||||
|
buf.data[13] = u32(log2(128.0));
|
||||||
|
buf.data[14] = u32(log2(255.0));
|
||||||
|
buf.data[15] = u32(log2(256.0));
|
||||||
|
buf.data[16] = u32(log2(511.0));
|
||||||
|
buf.data[17] = u32(log2(512.0));
|
||||||
|
buf.data[18] = u32(log2(4294967295.0));
|
||||||
|
})";
|
||||||
|
|
||||||
|
wgpu::ComputePipelineDescriptor csDesc;
|
||||||
|
csDesc.computeStage.module = utils::CreateShaderModuleFromWGSL(device, shader.c_str());
|
||||||
|
csDesc.computeStage.entryPoint = "main";
|
||||||
|
wgpu::ComputePipeline pipeline = device.CreateComputePipeline(&csDesc);
|
||||||
|
|
||||||
|
wgpu::BindGroup bindGroup =
|
||||||
|
utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0), {{0, buffer}});
|
||||||
|
|
||||||
|
wgpu::CommandBuffer commands;
|
||||||
|
{
|
||||||
|
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||||
|
wgpu::ComputePassEncoder pass = encoder.BeginComputePass();
|
||||||
|
pass.SetPipeline(pipeline);
|
||||||
|
pass.SetBindGroup(0, bindGroup);
|
||||||
|
pass.Dispatch(1);
|
||||||
|
pass.EndPass();
|
||||||
|
|
||||||
|
commands = encoder.Finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
queue.Submit(1, &commands);
|
||||||
|
|
||||||
|
EXPECT_BUFFER_U32_RANGE_EQ(expected.data(), buffer, 0, kSteps);
|
||||||
|
}
|
||||||
|
|
||||||
|
DAWN_INSTANTIATE_TEST(ShaderTests,
|
||||||
|
D3D12Backend(),
|
||||||
|
MetalBackend(),
|
||||||
|
OpenGLBackend(),
|
||||||
|
OpenGLESBackend(),
|
||||||
|
VulkanBackend());
|
Loading…
Reference in New Issue