mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-16 00:17:03 +00:00
Check FP16 support on vulkan backend
This patch check FP16 support on vulkan backend, and introduces the shader_float16 extension. BUG=dawn:426 TEST=dawn_end2end_tests Change-Id: Ie09568a416ce9eb2c11afeede3e7da520550d5fb Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/21901 Commit-Queue: Xinghua Cao <xinghua.cao@intel.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jiawei Shao <jiawei.shao@intel.com> Reviewed-by: Kai Ninomiya <kainino@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
3e332cd475
commit
bdc05c3d5f
@@ -287,6 +287,7 @@ source_set("dawn_end2end_tests_sources") {
|
||||
"end2end/RenderPassTests.cpp",
|
||||
"end2end/SamplerTests.cpp",
|
||||
"end2end/ScissorTests.cpp",
|
||||
"end2end/ShaderFloat16Tests.cpp",
|
||||
"end2end/StorageTextureTests.cpp",
|
||||
"end2end/TextureFormatTests.cpp",
|
||||
"end2end/TextureSubresourceTests.cpp",
|
||||
|
||||
@@ -1144,6 +1144,7 @@ namespace detail {
|
||||
}
|
||||
|
||||
template class ExpectEq<uint8_t>;
|
||||
template class ExpectEq<uint16_t>;
|
||||
template class ExpectEq<uint32_t>;
|
||||
template class ExpectEq<RGBA8>;
|
||||
template class ExpectEq<float>;
|
||||
|
||||
@@ -30,6 +30,14 @@
|
||||
// until the end of the test. Also expectations use a copy to a MapRead buffer to get the data
|
||||
// so resources should have the CopySrc allowed usage bit if you want to add expectations on
|
||||
// them.
|
||||
#define EXPECT_BUFFER_U16_EQ(expected, buffer, offset) \
|
||||
AddBufferExpectation(__FILE__, __LINE__, buffer, offset, sizeof(uint16_t), \
|
||||
new ::detail::ExpectEq<uint16_t>(expected))
|
||||
|
||||
#define EXPECT_BUFFER_U16_RANGE_EQ(expected, buffer, offset, count) \
|
||||
AddBufferExpectation(__FILE__, __LINE__, buffer, offset, sizeof(uint16_t) * count, \
|
||||
new ::detail::ExpectEq<uint16_t>(expected, count))
|
||||
|
||||
#define EXPECT_BUFFER_U32_EQ(expected, buffer, offset) \
|
||||
AddBufferExpectation(__FILE__, __LINE__, buffer, offset, sizeof(uint32_t), \
|
||||
new ::detail::ExpectEq<uint32_t>(expected))
|
||||
@@ -418,6 +426,7 @@ namespace detail {
|
||||
std::vector<T> mExpected;
|
||||
};
|
||||
extern template class ExpectEq<uint8_t>;
|
||||
extern template class ExpectEq<int16_t>;
|
||||
extern template class ExpectEq<uint32_t>;
|
||||
extern template class ExpectEq<RGBA8>;
|
||||
extern template class ExpectEq<float>;
|
||||
|
||||
111
src/tests/end2end/ShaderFloat16Tests.cpp
Normal file
111
src/tests/end2end/ShaderFloat16Tests.cpp
Normal file
@@ -0,0 +1,111 @@
|
||||
// Copyright 2020 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 "common/Math.h"
|
||||
#include "tests/DawnTest.h"
|
||||
|
||||
#include "utils/WGPUHelpers.h"
|
||||
|
||||
class ShaderFloat16Tests : public DawnTest {
|
||||
protected:
|
||||
std::vector<const char*> GetRequiredExtensions() override {
|
||||
mIsShaderFloat16Supported = SupportsExtensions({"shader_float16"});
|
||||
if (!mIsShaderFloat16Supported) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return {"shader_float16"};
|
||||
}
|
||||
|
||||
bool IsShaderFloat16Supported() const {
|
||||
return mIsShaderFloat16Supported;
|
||||
}
|
||||
|
||||
bool mIsShaderFloat16Supported = false;
|
||||
};
|
||||
|
||||
// Test basic 16bit float arithmetic and 16bit storage features.
|
||||
TEST_P(ShaderFloat16Tests, VendorIdFilter) {
|
||||
DAWN_SKIP_TEST_IF(!IsShaderFloat16Supported());
|
||||
|
||||
uint16_t uniformData[] = {Float32ToFloat16(1.23), Float32ToFloat16(0.0)}; // 0.0 is a padding.
|
||||
wgpu::Buffer uniformBuffer = utils::CreateBufferFromData(
|
||||
device, &uniformData, sizeof(uniformData), wgpu::BufferUsage::Uniform);
|
||||
|
||||
uint16_t bufferInData[] = {Float32ToFloat16(2.34), Float32ToFloat16(0.0)}; // 0.0 is a padding.
|
||||
wgpu::Buffer bufferIn = utils::CreateBufferFromData(device, &bufferInData, sizeof(bufferInData),
|
||||
wgpu::BufferUsage::Storage);
|
||||
|
||||
// TODO(xinghua.cao@intel.com): the zero for padding is required now. No need to
|
||||
// createBufferFromData once buffer lazy-zero-init is done.
|
||||
uint16_t bufferOutData[] = {Float32ToFloat16(0.0), Float32ToFloat16(0.0)};
|
||||
wgpu::Buffer bufferOut =
|
||||
utils::CreateBufferFromData(device, &bufferOutData, sizeof(bufferOutData),
|
||||
wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopySrc);
|
||||
|
||||
wgpu::ShaderModule module =
|
||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
|
||||
#version 450
|
||||
|
||||
#extension GL_AMD_gpu_shader_half_float : require
|
||||
|
||||
struct S {
|
||||
float16_t f;
|
||||
float16_t padding;
|
||||
};
|
||||
layout(std140, set = 0, binding = 0) uniform uniformBuf {
|
||||
S c;
|
||||
};
|
||||
|
||||
layout(std140, set = 0, binding = 1) readonly buffer bufA {
|
||||
S a;
|
||||
} ;
|
||||
|
||||
layout(std140, set = 0, binding = 2) buffer bufB {
|
||||
S b;
|
||||
} ;
|
||||
|
||||
void main() {
|
||||
b.f = a.f + c.f;
|
||||
}
|
||||
|
||||
)");
|
||||
|
||||
wgpu::ComputePipelineDescriptor csDesc;
|
||||
csDesc.computeStage.module = module;
|
||||
csDesc.computeStage.entryPoint = "main";
|
||||
wgpu::ComputePipeline pipeline = device.CreateComputePipeline(&csDesc);
|
||||
|
||||
wgpu::BindGroup bindGroup = utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0),
|
||||
{
|
||||
{0, uniformBuffer, 0, sizeof(uniformData)},
|
||||
{1, bufferIn, 0, sizeof(bufferInData)},
|
||||
{2, bufferOut, 0, sizeof(bufferOutData)},
|
||||
});
|
||||
|
||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||
wgpu::ComputePassEncoder pass = encoder.BeginComputePass();
|
||||
pass.SetPipeline(pipeline);
|
||||
pass.SetBindGroup(0, bindGroup);
|
||||
pass.Dispatch(1);
|
||||
pass.EndPass();
|
||||
wgpu::CommandBuffer commands = encoder.Finish();
|
||||
queue.Submit(1, &commands);
|
||||
|
||||
uint16_t expected[] = {Float32ToFloat16(3.57), Float32ToFloat16(0.0)}; // 0.0 is a padding.
|
||||
|
||||
EXPECT_BUFFER_U16_RANGE_EQ(expected, bufferOut, 0, 2);
|
||||
}
|
||||
|
||||
DAWN_INSTANTIATE_TEST(ShaderFloat16Tests, VulkanBackend());
|
||||
Reference in New Issue
Block a user