[Bf-blender-cvs] [94a98b9365f] temp-vulkan-shader: Copied over GLSL code gen functions from GLShader.
Jeroen Bakker
noreply at git.blender.org
Fri Nov 25 14:16:52 CET 2022
Commit: 94a98b9365f2e1bef3ab0b1ebfa2e1c004afc181
Author: Jeroen Bakker
Date: Fri Nov 25 13:59:39 2022 +0100
Branches: temp-vulkan-shader
https://developer.blender.org/rB94a98b9365f2e1bef3ab0b1ebfa2e1c004afc181
Copied over GLSL code gen functions from GLShader.
===================================================================
M source/blender/gpu/vulkan/vk_shader.cc
===================================================================
diff --git a/source/blender/gpu/vulkan/vk_shader.cc b/source/blender/gpu/vulkan/vk_shader.cc
index 43b99882ff0..120abbd91e2 100644
--- a/source/blender/gpu/vulkan/vk_shader.cc
+++ b/source/blender/gpu/vulkan/vk_shader.cc
@@ -13,8 +13,423 @@
#include "BLI_string_utils.h"
#include "BLI_vector.hh"
+using namespace blender::gpu::shader;
+
namespace blender::gpu {
+/* -------------------------------------------------------------------- */
+/** \name Create Info
+ * \{ */
+
+static const char *to_string(const Interpolation &interp)
+{
+ switch (interp) {
+ case Interpolation::SMOOTH:
+ return "smooth";
+ case Interpolation::FLAT:
+ return "flat";
+ case Interpolation::NO_PERSPECTIVE:
+ return "noperspective";
+ default:
+ return "unknown";
+ }
+}
+
+static const char *to_string(const Type &type)
+{
+ switch (type) {
+ case Type::FLOAT:
+ return "float";
+ case Type::VEC2:
+ return "vec2";
+ case Type::VEC3:
+ return "vec3";
+ case Type::VEC4:
+ return "vec4";
+ case Type::MAT3:
+ return "mat3";
+ case Type::MAT4:
+ return "mat4";
+ case Type::UINT:
+ return "uint";
+ case Type::UVEC2:
+ return "uvec2";
+ case Type::UVEC3:
+ return "uvec3";
+ case Type::UVEC4:
+ return "uvec4";
+ case Type::INT:
+ return "int";
+ case Type::IVEC2:
+ return "ivec2";
+ case Type::IVEC3:
+ return "ivec3";
+ case Type::IVEC4:
+ return "ivec4";
+ case Type::BOOL:
+ return "bool";
+ default:
+ return "unknown";
+ }
+}
+
+static const char *to_string(const eGPUTextureFormat &type)
+{
+ switch (type) {
+ case GPU_RGBA8UI:
+ return "rgba8ui";
+ case GPU_RGBA8I:
+ return "rgba8i";
+ case GPU_RGBA8:
+ return "rgba8";
+ case GPU_RGBA32UI:
+ return "rgba32ui";
+ case GPU_RGBA32I:
+ return "rgba32i";
+ case GPU_RGBA32F:
+ return "rgba32f";
+ case GPU_RGBA16UI:
+ return "rgba16ui";
+ case GPU_RGBA16I:
+ return "rgba16i";
+ case GPU_RGBA16F:
+ return "rgba16f";
+ case GPU_RGBA16:
+ return "rgba16";
+ case GPU_RG8UI:
+ return "rg8ui";
+ case GPU_RG8I:
+ return "rg8i";
+ case GPU_RG8:
+ return "rg8";
+ case GPU_RG32UI:
+ return "rg32ui";
+ case GPU_RG32I:
+ return "rg32i";
+ case GPU_RG32F:
+ return "rg32f";
+ case GPU_RG16UI:
+ return "rg16ui";
+ case GPU_RG16I:
+ return "rg16i";
+ case GPU_RG16F:
+ return "rg16f";
+ case GPU_RG16:
+ return "rg16";
+ case GPU_R8UI:
+ return "r8ui";
+ case GPU_R8I:
+ return "r8i";
+ case GPU_R8:
+ return "r8";
+ case GPU_R32UI:
+ return "r32ui";
+ case GPU_R32I:
+ return "r32i";
+ case GPU_R32F:
+ return "r32f";
+ case GPU_R16UI:
+ return "r16ui";
+ case GPU_R16I:
+ return "r16i";
+ case GPU_R16F:
+ return "r16f";
+ case GPU_R16:
+ return "r16";
+ case GPU_R11F_G11F_B10F:
+ return "r11f_g11f_b10f";
+ case GPU_RGB10_A2:
+ return "rgb10_a2";
+ default:
+ return "unknown";
+ }
+}
+
+static const char *to_string(const PrimitiveIn &layout)
+{
+ switch (layout) {
+ case PrimitiveIn::POINTS:
+ return "points";
+ case PrimitiveIn::LINES:
+ return "lines";
+ case PrimitiveIn::LINES_ADJACENCY:
+ return "lines_adjacency";
+ case PrimitiveIn::TRIANGLES:
+ return "triangles";
+ case PrimitiveIn::TRIANGLES_ADJACENCY:
+ return "triangles_adjacency";
+ default:
+ return "unknown";
+ }
+}
+
+static const char *to_string(const PrimitiveOut &layout)
+{
+ switch (layout) {
+ case PrimitiveOut::POINTS:
+ return "points";
+ case PrimitiveOut::LINE_STRIP:
+ return "line_strip";
+ case PrimitiveOut::TRIANGLE_STRIP:
+ return "triangle_strip";
+ default:
+ return "unknown";
+ }
+}
+
+static const char *to_string(const DepthWrite &value)
+{
+ switch (value) {
+ case DepthWrite::ANY:
+ return "depth_any";
+ case DepthWrite::GREATER:
+ return "depth_greater";
+ case DepthWrite::LESS:
+ return "depth_less";
+ default:
+ return "depth_unchanged";
+ }
+}
+
+static void print_image_type(std::ostream &os,
+ const ImageType &type,
+ const ShaderCreateInfo::Resource::BindType bind_type)
+{
+ switch (type) {
+ case ImageType::INT_BUFFER:
+ case ImageType::INT_1D:
+ case ImageType::INT_1D_ARRAY:
+ case ImageType::INT_2D:
+ case ImageType::INT_2D_ARRAY:
+ case ImageType::INT_3D:
+ case ImageType::INT_CUBE:
+ case ImageType::INT_CUBE_ARRAY:
+ os << "i";
+ break;
+ case ImageType::UINT_BUFFER:
+ case ImageType::UINT_1D:
+ case ImageType::UINT_1D_ARRAY:
+ case ImageType::UINT_2D:
+ case ImageType::UINT_2D_ARRAY:
+ case ImageType::UINT_3D:
+ case ImageType::UINT_CUBE:
+ case ImageType::UINT_CUBE_ARRAY:
+ os << "u";
+ break;
+ default:
+ break;
+ }
+
+ if (bind_type == ShaderCreateInfo::Resource::BindType::IMAGE) {
+ os << "image";
+ }
+ else {
+ os << "sampler";
+ }
+
+ switch (type) {
+ case ImageType::FLOAT_BUFFER:
+ case ImageType::INT_BUFFER:
+ case ImageType::UINT_BUFFER:
+ os << "Buffer";
+ break;
+ case ImageType::FLOAT_1D:
+ case ImageType::FLOAT_1D_ARRAY:
+ case ImageType::INT_1D:
+ case ImageType::INT_1D_ARRAY:
+ case ImageType::UINT_1D:
+ case ImageType::UINT_1D_ARRAY:
+ os << "1D";
+ break;
+ case ImageType::FLOAT_2D:
+ case ImageType::FLOAT_2D_ARRAY:
+ case ImageType::INT_2D:
+ case ImageType::INT_2D_ARRAY:
+ case ImageType::UINT_2D:
+ case ImageType::UINT_2D_ARRAY:
+ case ImageType::SHADOW_2D:
+ case ImageType::SHADOW_2D_ARRAY:
+ case ImageType::DEPTH_2D:
+ case ImageType::DEPTH_2D_ARRAY:
+ os << "2D";
+ break;
+ case ImageType::FLOAT_3D:
+ case ImageType::INT_3D:
+ case ImageType::UINT_3D:
+ os << "3D";
+ break;
+ case ImageType::FLOAT_CUBE:
+ case ImageType::FLOAT_CUBE_ARRAY:
+ case ImageType::INT_CUBE:
+ case ImageType::INT_CUBE_ARRAY:
+ case ImageType::UINT_CUBE:
+ case ImageType::UINT_CUBE_ARRAY:
+ case ImageType::SHADOW_CUBE:
+ case ImageType::SHADOW_CUBE_ARRAY:
+ case ImageType::DEPTH_CUBE:
+ case ImageType::DEPTH_CUBE_ARRAY:
+ os << "Cube";
+ break;
+ default:
+ break;
+ }
+
+ switch (type) {
+ case ImageType::FLOAT_1D_ARRAY:
+ case ImageType::FLOAT_2D_ARRAY:
+ case ImageType::FLOAT_CUBE_ARRAY:
+ case ImageType::INT_1D_ARRAY:
+ case ImageType::INT_2D_ARRAY:
+ case ImageType::INT_CUBE_ARRAY:
+ case ImageType::UINT_1D_ARRAY:
+ case ImageType::UINT_2D_ARRAY:
+ case ImageType::UINT_CUBE_ARRAY:
+ case ImageType::SHADOW_2D_ARRAY:
+ case ImageType::SHADOW_CUBE_ARRAY:
+ case ImageType::DEPTH_2D_ARRAY:
+ case ImageType::DEPTH_CUBE_ARRAY:
+ os << "Array";
+ break;
+ default:
+ break;
+ }
+
+ switch (type) {
+ case ImageType::SHADOW_2D:
+ case ImageType::SHADOW_2D_ARRAY:
+ case ImageType::SHADOW_CUBE:
+ case ImageType::SHADOW_CUBE_ARRAY:
+ os << "Shadow";
+ break;
+ default:
+ break;
+ }
+ os << " ";
+}
+
+static std::ostream &print_qualifier(std::ostream &os, const Qualifier &qualifiers)
+{
+ if (bool(qualifiers & Qualifier::NO_RESTRICT) == false) {
+ os << "restrict ";
+ }
+ if (bool(qualifiers & Qualifier::READ) == false) {
+ os << "writeonly ";
+ }
+ if (bool(qualifiers & Qualifier::WRITE) == false) {
+ os << "readonly ";
+ }
+ return os;
+}
+
+static void print_resource(std::ostream &os, const ShaderCreateInfo::Resource &res)
+{
+ os << "layout(binding = " << res.slot;
+ if (res.bind_type == ShaderCreateInfo::Resource::BindType::IMAGE) {
+ os << ", " << to_string(res.image.format);
+ }
+ else if (res.bind_type == ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER) {
+ os << ", std140";
+ }
+ else if (res.bind_type == ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER) {
+ os << ", std430";
+ }
+ os << ") ";
+
+ int64_t array_offset;
+ StringRef name_no_array;
+
+ switch (res.bind_type) {
+ case ShaderCreateInfo::Resource::BindType::SAMPLER:
+ os << "uniform ";
+ print_image_type(os, res.sampler.type, res.bind_type);
+ os << res.sampler.name << ";\n";
+ break;
+ case ShaderCreateInfo::Resource::BindType::IMAGE:
+ os << "uniform ";
+ print_qualifier(os, res.image.qualifiers);
+ print_image_type(os, res.image.type, res.bind_type);
+ os << res.image.name << ";\n";
+ break;
+ case ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER:
+ array_offset = res.uniformbuf.name.find_first_of("[");
+ name_no_array = (array_offset == -1) ? res.uniformbuf.name :
+ StringRef(res.uniformbuf.name.c_str(), array_offset);
+ os << "uniform " << name_no_array << " { " << res.uniformbuf.type_name << " _"
+ << res.uniformbuf.name << "; };\n";
+ break;
+ case ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER:
+ array_offset = res.storagebuf.name.find_first_of("[");
+ name_no_array = (array_offset == -1) ? res.storagebuf.name :
+ StringRef(res.storagebuf.name.c_str(), array_offset);
+ print_qualifier(os, res.storagebuf.qualifiers);
+ os << "buffer ";
+ os << name_no_array << " { " << res.storagebuf.type_name << " _" << res.storagebuf.name
+ << "; };\n";
+ break;
+ }
+}
+
+static void print_resource_alias(std::ostream &os, const ShaderCreateInfo::Resource &res)
+{
+ int64_t array_offset;
+ StringRef name_no_array;
+
+ switch (res.bind_type) {
+ case ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER:
+ array_offset = res.uniformbuf.name.find_first_of("[");
+ name_no_array = (array_offset == -1) ? res.uniformbuf.name :
+ StringRef(res.uniformbuf.name.c_str(), array_offset);
+ os << "#define " << name_no_array << " (_" << name_no_array << ")\n";
+ break;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list