blob: 5365a8a34cc571722624f661e6390e6ac499721e [file] [log] [blame]
//
// 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.
//
#ifndef LIBANGLE_RENDERER_VULKAN_CLSPV_UTILS_H_
#define LIBANGLE_RENDERER_VULKAN_CLSPV_UTILS_H_
#include <string>
#include <vector>
#include <libANGLE/renderer/vulkan/CLDeviceVk.h>
#include "clspv/Compiler.h"
#include "clspv/Sampler.h"
#include "spirv-tools/libspirv.h"
namespace rx
{
struct ClspvPrintfBufferStorage
{
uint32_t descriptorSet = 0;
uint32_t binding = 0;
uint32_t pcOffset = 0;
uint32_t size = 0;
};
struct ClspvPrintfInfo
{
uint32_t id = 0;
std::string formatSpecifier;
std::vector<uint32_t> argSizes;
};
struct ClspvLiteralSampler
{
uint32_t descriptorSet;
uint32_t binding;
cl_bool normalizedCoords;
cl::AddressingMode addressingMode;
cl::FilterMode filterMode;
};
namespace clspv_cl
{
cl::AddressingMode GetAddressingMode(uint32_t mask);
cl::FilterMode GetFilterMode(uint32_t mask);
inline bool IsNormalizedCoords(uint32_t mask)
{
return (mask & clspv::kSamplerNormalizedCoordsMask) == clspv::CLK_NORMALIZED_COORDS_TRUE;
}
} // namespace clspv_cl
angle::Result ClspvProcessPrintfBuffer(unsigned char *buffer,
const size_t bufferSize,
const angle::HashMap<uint32_t, ClspvPrintfInfo> *infoMap);
// 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);
ClspvError ClspvCompileSource(const size_t programCount,
const size_t *programSizes,
const char **programs,
const char *options,
char **outputBinary,
size_t *outputBinarySize,
char **outputLog);
spv_target_env ClspvGetSpirvVersion(const vk::Renderer *renderer);
bool ClspvValidate(vk::Renderer *rendererVk, const angle::spirv::Blob &blob);
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_CLSPV_UTILS_H_