From 0929a8d720559456fa28819a175930a990ad401a Mon Sep 17 00:00:00 2001 From: Gowtham Tammana Date: Tue, 13 Aug 2024 10:43:06 -0500 Subject: [PATCH] CL/Vulkan: Add utility function for clspv compile options Add a utility function for querying the options based on the vulkan renderer for the clspv compiler. Bug: angleproject:361717757 Change-Id: I9722b8a80bcad3f2b799d87b8fbe29c84a686a6e Signed-off-by: Gowtham Tammana Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5810696 Reviewed-by: Shahbaz Youssefi Reviewed-by: Charlie Lao --- src/libANGLE/renderer/vulkan/CLDeviceVk.h | 1 + src/libANGLE/renderer/vulkan/CLProgramVk.cpp | 10 +-- src/libANGLE/renderer/vulkan/clspv_utils.cpp | 64 +++++++++++++++++++ src/libANGLE/renderer/vulkan/clspv_utils.h | 17 +++++ .../renderer/vulkan/vulkan_backend.gni | 2 + 5 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 src/libANGLE/renderer/vulkan/clspv_utils.cpp create mode 100644 src/libANGLE/renderer/vulkan/clspv_utils.h diff --git a/src/libANGLE/renderer/vulkan/CLDeviceVk.h b/src/libANGLE/renderer/vulkan/CLDeviceVk.h index d4bcbdc37f7..35ddc307e12 100644 --- a/src/libANGLE/renderer/vulkan/CLDeviceVk.h +++ b/src/libANGLE/renderer/vulkan/CLDeviceVk.h @@ -27,6 +27,7 @@ class CLDeviceVk : public CLDeviceImpl Info createInfo(cl::DeviceType type) const override; + const vk::Renderer *getRenderer() const { return mRenderer; } angle::Result getInfoUInt(cl::DeviceInfo name, cl_uint *value) const override; angle::Result getInfoULong(cl::DeviceInfo name, cl_ulong *value) const override; angle::Result getInfoSizeT(cl::DeviceInfo name, size_t *value) const override; diff --git a/src/libANGLE/renderer/vulkan/CLProgramVk.cpp b/src/libANGLE/renderer/vulkan/CLProgramVk.cpp index 68f53b5327b..99bf5586041 100644 --- a/src/libANGLE/renderer/vulkan/CLProgramVk.cpp +++ b/src/libANGLE/renderer/vulkan/CLProgramVk.cpp @@ -8,6 +8,7 @@ #include "libANGLE/renderer/vulkan/CLProgramVk.h" #include "libANGLE/renderer/vulkan/CLContextVk.h" #include "libANGLE/renderer/vulkan/CLDeviceVk.h" +#include "libANGLE/renderer/vulkan/clspv_utils.h" #include "libANGLE/CLContext.h" #include "libANGLE/CLKernel.h" @@ -229,9 +230,6 @@ std::string ProcessBuildOptions(const std::vector &optionTokens, break; } - // Other internal Clspv compiler flags that are needed/required - processedOptions += " --long-vector"; - return processedOptions; } @@ -779,10 +777,8 @@ bool CLProgramVk::buildInternal(const cl::DevicePtrs &devices, const cl::RefPointer &device = devices.at(i); DeviceProgramData &deviceProgramData = mAssociatedDevicePrograms[device->getNative()]; - cl_uint addressBits; - ANGLE_CL_IMPL_TRY( - device->getInfo(cl::DeviceInfo::AddressBits, sizeof(cl_uint), &addressBits, nullptr)); - processedOptions += addressBits == 64 ? " -arch=spir64" : " -arch=spir"; + // add clspv compiler options based on device features + processedOptions += ClspvGetCompilerOptions(&device->getImpl()); if (buildType != BuildType::BINARY) { diff --git a/src/libANGLE/renderer/vulkan/clspv_utils.cpp b/src/libANGLE/renderer/vulkan/clspv_utils.cpp new file mode 100644 index 00000000000..d9d328c75c0 --- /dev/null +++ b/src/libANGLE/renderer/vulkan/clspv_utils.cpp @@ -0,0 +1,64 @@ +// +// Copyright 2024 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Utilities to map clspv interface variables to OpenCL and Vulkan mappings. +// + +#include "libANGLE/renderer/vulkan/clspv_utils.h" +#include "libANGLE/renderer/vulkan/CLDeviceVk.h" + +#include + +namespace rx +{ +std::string ClspvGetCompilerOptions(const CLDeviceVk *device) +{ + ASSERT(device && device->getRenderer()); + const vk::Renderer *rendererVk = device->getRenderer(); + std::string options{""}; + + cl_uint addressBits; + if (IsError(device->getInfoUInt(cl::DeviceInfo::AddressBits, &addressBits))) + { + // This should'nt fail here + ASSERT(false); + } + options += addressBits == 64 ? " -arch=spir64" : " -arch=spir"; + + // Other internal Clspv compiler flags that are needed/required + options += " --long-vector"; + + // 8 bit storage buffer support + if (!rendererVk->getFeatures().supports8BitStorageBuffer.enabled) + { + options += " --no-8bit-storage=ssbo"; + } + if (!rendererVk->getFeatures().supports8BitUniformAndStorageBuffer.enabled) + { + options += " --no-8bit-storage=ubo"; + } + if (!rendererVk->getFeatures().supports8BitPushConstant.enabled) + { + options += " --no-8bit-storage=pushconstant"; + } + + // 16 bit storage options + if (!rendererVk->getFeatures().supports16BitStorageBuffer.enabled) + { + options += " --no-16bit-storage=ssbo"; + } + if (!rendererVk->getFeatures().supports16BitUniformAndStorageBuffer.enabled) + { + options += " --no-16bit-storage=ubo"; + } + if (!rendererVk->getFeatures().supports16BitPushConstant.enabled) + { + options += " --no-16bit-storage=pushconstant"; + } + + return options; +} + +} // namespace rx diff --git a/src/libANGLE/renderer/vulkan/clspv_utils.h b/src/libANGLE/renderer/vulkan/clspv_utils.h new file mode 100644 index 00000000000..c2b086c2714 --- /dev/null +++ b/src/libANGLE/renderer/vulkan/clspv_utils.h @@ -0,0 +1,17 @@ +// +// Copyright 2024 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. +// +// clspv_utils: +// Utilities to map clspv interface variables to OpenCL and Vulkan mappings. +// + +#include + +namespace rx +{ +// Populate a list of options that can be supported by clspv based on the features supported by the +// vulkan renderer. +std::string ClspvGetCompilerOptions(const CLDeviceVk *device); + +} // namespace rx diff --git a/src/libANGLE/renderer/vulkan/vulkan_backend.gni b/src/libANGLE/renderer/vulkan/vulkan_backend.gni index 9d2219f6c1d..e60c339aeac 100644 --- a/src/libANGLE/renderer/vulkan/vulkan_backend.gni +++ b/src/libANGLE/renderer/vulkan/vulkan_backend.gni @@ -130,6 +130,8 @@ if (angle_enable_cl) { "CLSamplerVk.cpp", "CLSamplerVk.h", "cl_types.h", + "clspv_utils.cpp", + "clspv_utils.h", ] }