mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-16 00:17:03 +00:00
Reland "Check FP16 support on vulkan backend"
This reverts commit0357eed7deand reland commitbdc05c3d5f. The Vulkan-Loader has a bug where if the instance is created with Vulkan 1.1 and not the promoted extensions, it will skip emulation and if the ICD doesn't support Vulkan 1.1 nor the extensions. Enable the promoted extensions, even when creating a Vulkan 1.1 instance. Original change's description: > 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> Bug: chromium:1087896, dawn:426 Change-Id: I2c4465fb2fe957966b44d3e5840112219481c639 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/22781 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
e472c459b9
commit
db8f804bc3
@@ -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/SubresourceOutputAttachmentTests.cpp",
|
||||
"end2end/TextureFormatTests.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, Basic16BitFloatFeaturesTest) {
|
||||
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