SubDiv: Use shader create info for custom data
This PR migrates the custom_data_interp_comp.glsl to use shader create info. During development tests have been conducted to use specialization constants, but due to limitations inside Metal we didn't use them. Number of ShaderCreateInfos have been reduced by using macros. Variadic macros have not been used as they don't support CPP compilation. Pull Request: https://projects.blender.org/blender/blender/pulls/134932
This commit is contained in:
@@ -1286,15 +1286,14 @@ void draw_subdiv_interp_custom_data(const DRWSubdivCache &cache,
|
||||
GPUShader *shader = DRW_shader_subdiv_custom_data_get(comp_type, dimensions);
|
||||
GPU_shader_bind(shader);
|
||||
|
||||
int binding_point = 0;
|
||||
/* subdiv_face_offset is always at binding point 0 for each shader using it. */
|
||||
GPU_vertbuf_bind_as_ssbo(cache.subdiv_face_offset_buffer, binding_point++);
|
||||
GPU_vertbuf_bind_as_ssbo(&src_data, binding_point++);
|
||||
GPU_vertbuf_bind_as_ssbo(cache.face_ptex_offset_buffer, binding_point++);
|
||||
GPU_vertbuf_bind_as_ssbo(cache.corner_patch_coords, binding_point++);
|
||||
GPU_vertbuf_bind_as_ssbo(cache.extra_coarse_face_data, binding_point++);
|
||||
GPU_vertbuf_bind_as_ssbo(&dst_data, binding_point++);
|
||||
BLI_assert(binding_point <= MAX_GPU_SUBDIV_SSBOS);
|
||||
GPU_vertbuf_bind_as_ssbo(cache.subdiv_face_offset_buffer, SUBDIV_FACE_OFFSET_BUF_SLOT);
|
||||
GPU_vertbuf_bind_as_ssbo(&src_data, CUSTOM_DATA_SOURCE_DATA_BUF_SLOT);
|
||||
GPU_vertbuf_bind_as_ssbo(cache.face_ptex_offset_buffer, CUSTOM_DATA_FACE_PTEX_OFFSET_BUF_SLOT);
|
||||
GPU_vertbuf_bind_as_ssbo(cache.corner_patch_coords, CUSTOM_DATA_PATCH_COORDS_BUF_SLOT);
|
||||
GPU_vertbuf_bind_as_ssbo(cache.extra_coarse_face_data,
|
||||
CUSTOM_DATA_EXTRA_COARSE_FACE_DATA_BUF_SLOT);
|
||||
GPU_vertbuf_bind_as_ssbo(&dst_data, CUSTOM_DATA_DESTINATION_DATA_BUF_SLOT);
|
||||
|
||||
drw_subdiv_compute_dispatch(cache, shader, 0, dst_offset, cache.num_subdiv_quads);
|
||||
|
||||
|
||||
@@ -163,6 +163,8 @@ static blender::StringRefNull get_subdiv_shader_info_name(SubdivShaderType shade
|
||||
case SubdivShaderType::BUFFER_LNOR:
|
||||
return "subdiv_loop_normals";
|
||||
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -212,17 +214,8 @@ static blender::StringRefNull get_subdiv_shader_name(SubdivShaderType shader_typ
|
||||
case SubdivShaderType::PATCH_EVALUATION_ORCO: {
|
||||
return "subdiv patch evaluation orco";
|
||||
}
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_1D: {
|
||||
return "subdiv custom data interp 1D";
|
||||
}
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_2D: {
|
||||
return "subdiv custom data interp 2D";
|
||||
}
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_3D: {
|
||||
return "subdiv custom data interp 3D";
|
||||
}
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_4D: {
|
||||
return "subdiv custom data interp 4D";
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP: {
|
||||
return "subdiv custom data interp";
|
||||
}
|
||||
case SubdivShaderType::BUFFER_SCULPT_DATA: {
|
||||
return "subdiv sculpt data";
|
||||
@@ -268,10 +261,7 @@ static blender::StringRefNull get_subdiv_shader_code(SubdivShaderType shader_typ
|
||||
case SubdivShaderType::PATCH_EVALUATION_ORCO: {
|
||||
return datatoc_subdiv_patch_evaluation_comp_glsl;
|
||||
}
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_1D:
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_2D:
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_3D:
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP_4D: {
|
||||
case SubdivShaderType::COMP_CUSTOM_DATA_INTERP: {
|
||||
return datatoc_subdiv_custom_data_interp_comp_glsl;
|
||||
}
|
||||
case SubdivShaderType::BUFFER_SCULPT_DATA: {
|
||||
@@ -351,11 +341,7 @@ GPUShader *DRW_shader_subdiv_get(SubdivShaderType shader_type)
|
||||
return draw_shader_subdiv_patch_evaluation_get(shader_type);
|
||||
}
|
||||
|
||||
BLI_assert(!ELEM(shader_type,
|
||||
SubdivShaderType::COMP_CUSTOM_DATA_INTERP_1D,
|
||||
SubdivShaderType::COMP_CUSTOM_DATA_INTERP_2D,
|
||||
SubdivShaderType::COMP_CUSTOM_DATA_INTERP_3D,
|
||||
SubdivShaderType::COMP_CUSTOM_DATA_INTERP_4D));
|
||||
BLI_assert(!ELEM(shader_type, SubdivShaderType::COMP_CUSTOM_DATA_INTERP));
|
||||
|
||||
if (e_data.subdiv_sh[uint(shader_type)] == nullptr &&
|
||||
ELEM(shader_type,
|
||||
@@ -395,29 +381,38 @@ GPUShader *DRW_shader_subdiv_custom_data_get(GPUVertCompType comp_type, int dime
|
||||
GPUShader *&shader = e_data.subdiv_custom_data_sh[dimensions - 1][comp_type];
|
||||
|
||||
if (shader == nullptr) {
|
||||
SubdivShaderType shader_type = SubdivShaderType(
|
||||
uint(SubdivShaderType::COMP_CUSTOM_DATA_INTERP_1D) + dimensions - 1);
|
||||
const blender::StringRefNull compute_code = get_subdiv_shader_code(shader_type);
|
||||
|
||||
std::string defines = "#define SUBDIV_POLYGON_OFFSET\n";
|
||||
defines += "#define DIMENSIONS " + std::to_string(dimensions) + "\n";
|
||||
switch (comp_type) {
|
||||
case GPU_COMP_U16:
|
||||
defines += "#define GPU_COMP_U16\n";
|
||||
std::string info_name = "subdiv_custom_data_interp";
|
||||
switch (dimensions) {
|
||||
case 1:
|
||||
info_name += "_1d";
|
||||
break;
|
||||
case GPU_COMP_I32:
|
||||
defines += "#define GPU_COMP_I32\n";
|
||||
case 2:
|
||||
info_name += "_2d";
|
||||
break;
|
||||
case GPU_COMP_F32:
|
||||
/* float is the default */
|
||||
case 3:
|
||||
info_name += "_3d";
|
||||
break;
|
||||
case 4:
|
||||
info_name += "_4d";
|
||||
break;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
break;
|
||||
}
|
||||
|
||||
shader = GPU_shader_create_compute(
|
||||
compute_code, datatoc_subdiv_lib_glsl, defines, get_subdiv_shader_name(shader_type));
|
||||
switch (comp_type) {
|
||||
case GPU_COMP_U16:
|
||||
info_name += "_u16";
|
||||
break;
|
||||
case GPU_COMP_I32:
|
||||
info_name += "_i32";
|
||||
break;
|
||||
case GPU_COMP_F32:
|
||||
info_name += "_f32";
|
||||
break;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
}
|
||||
shader = GPU_shader_create_from_info_name(info_name.c_str());
|
||||
}
|
||||
return shader;
|
||||
}
|
||||
|
||||
@@ -41,15 +41,12 @@ enum class SubdivShaderType {
|
||||
PATCH_EVALUATION_FACE_DOTS = 11,
|
||||
PATCH_EVALUATION_FACE_DOTS_WITH_NORMALS = 12,
|
||||
PATCH_EVALUATION_ORCO = 13,
|
||||
COMP_CUSTOM_DATA_INTERP_1D = 14,
|
||||
COMP_CUSTOM_DATA_INTERP_2D = 15,
|
||||
COMP_CUSTOM_DATA_INTERP_3D = 16,
|
||||
COMP_CUSTOM_DATA_INTERP_4D = 17,
|
||||
BUFFER_SCULPT_DATA = 18,
|
||||
BUFFER_UV_STRETCH_ANGLE = 19,
|
||||
BUFFER_UV_STRETCH_AREA = 20,
|
||||
COMP_CUSTOM_DATA_INTERP = 14,
|
||||
BUFFER_SCULPT_DATA = 15,
|
||||
BUFFER_UV_STRETCH_ANGLE = 16,
|
||||
BUFFER_UV_STRETCH_AREA = 17,
|
||||
};
|
||||
constexpr int SUBDIVISION_MAX_SHADERS = 21;
|
||||
constexpr int SUBDIVISION_MAX_SHADERS = 18;
|
||||
|
||||
GPUShader *DRW_shader_subdiv_get(SubdivShaderType shader_type);
|
||||
GPUShader *DRW_shader_subdiv_custom_data_get(GPUVertCompType comp_type, int dimensions);
|
||||
|
||||
@@ -32,6 +32,12 @@
|
||||
#define EDGE_FAC_POLY_OTHER_MAP_BUF_SLOT 2
|
||||
#define EDGE_FAC_EDGE_FAC_BUF_SLOT 3
|
||||
|
||||
#define CUSTOM_DATA_SOURCE_DATA_BUF_SLOT 1
|
||||
#define CUSTOM_DATA_FACE_PTEX_OFFSET_BUF_SLOT 2
|
||||
#define CUSTOM_DATA_PATCH_COORDS_BUF_SLOT 3
|
||||
#define CUSTOM_DATA_EXTRA_COARSE_FACE_DATA_BUF_SLOT 4
|
||||
#define CUSTOM_DATA_DESTINATION_DATA_BUF_SLOT 5
|
||||
|
||||
#define SCULPT_DATA_SCULPT_MASK_BUF_SLOT 0
|
||||
#define SCULPT_DATA_SCULPT_FACE_SET_COLOR_BUF_SLOT 1
|
||||
#define SCULPT_DATA_SCULPT_DATA_BUF_SLOT 2
|
||||
|
||||
@@ -87,3 +87,9 @@ struct CustomNormal {
|
||||
float y;
|
||||
float z;
|
||||
};
|
||||
|
||||
/* Structure for #CompressedPatchCoord. */
|
||||
struct BlenderPatchCoord {
|
||||
int patch_index;
|
||||
uint encoded_uv;
|
||||
};
|
||||
|
||||
@@ -34,6 +34,7 @@ set(SRC_GLSL_COMP
|
||||
subdiv_ibo_lines_comp.glsl
|
||||
subdiv_ibo_tris_comp.glsl
|
||||
subdiv_vbo_edge_fac_comp.glsl
|
||||
subdiv_custom_data_interp_comp.glsl
|
||||
subdiv_vbo_sculpt_data_comp.glsl
|
||||
subdiv_vbo_edituv_strech_angle_comp.glsl
|
||||
subdiv_vbo_edituv_strech_area_comp.glsl
|
||||
|
||||
@@ -2,44 +2,19 @@
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
/* To be compiled with subdiv_lib.glsl */
|
||||
#include "subdiv_lib.glsl"
|
||||
|
||||
layout(std430, binding = 1) readonly restrict buffer sourceBuffer
|
||||
{
|
||||
#if defined(GPU_COMP_U16)
|
||||
uint src_data[];
|
||||
#elif defined(GPU_COMP_I32)
|
||||
int src_data[];
|
||||
#else
|
||||
float src_data[];
|
||||
COMPUTE_SHADER_CREATE_INFO(subdiv_custom_data_interp_4d_f32)
|
||||
|
||||
#if defined(DIMENSIONS_1)
|
||||
# define DIMENSIONS 1
|
||||
#elif defined(DIMENSIONS_2)
|
||||
# define DIMENSIONS 2
|
||||
#elif defined(DIMENSIONS_3)
|
||||
# define DIMENSIONS 3
|
||||
#else // defined(DIMENSIONS_4)
|
||||
# define DIMENSIONS 4
|
||||
#endif
|
||||
};
|
||||
|
||||
layout(std430, binding = 2) readonly restrict buffer facePTexOffset
|
||||
{
|
||||
uint face_ptex_offset[];
|
||||
};
|
||||
|
||||
layout(std430, binding = 3) readonly restrict buffer patchCoords
|
||||
{
|
||||
BlenderPatchCoord patch_coords[];
|
||||
};
|
||||
|
||||
layout(std430, binding = 4) readonly restrict buffer extraCoarseFaceData
|
||||
{
|
||||
uint extra_coarse_face_data[];
|
||||
};
|
||||
|
||||
layout(std430, binding = 5) writeonly restrict buffer destBuffer
|
||||
{
|
||||
#if defined(GPU_COMP_U16)
|
||||
uint dst_data[];
|
||||
#elif defined(GPU_COMP_I32)
|
||||
int dst_data[];
|
||||
#else
|
||||
float dst_data[];
|
||||
#endif
|
||||
};
|
||||
|
||||
struct Vertex {
|
||||
float vertex_data[DIMENSIONS];
|
||||
@@ -92,7 +67,7 @@ Vertex read_vertex(uint index)
|
||||
void write_vertex(uint index, Vertex v)
|
||||
{
|
||||
#if defined(GPU_COMP_U16)
|
||||
uint base_index = dst_offset + index * 2;
|
||||
uint base_index = shader_data.dst_offset + index * 2;
|
||||
if (DIMENSIONS == 4) {
|
||||
uint x = uint(v.vertex_data[0] * 65535.0);
|
||||
uint y = uint(v.vertex_data[1] * 65535.0);
|
||||
@@ -110,12 +85,12 @@ void write_vertex(uint index, Vertex v)
|
||||
dst_data[base_index] = 0;
|
||||
}
|
||||
#elif defined(GPU_COMP_I32)
|
||||
uint base_index = dst_offset + index * DIMENSIONS;
|
||||
uint base_index = shader_data.dst_offset + index * DIMENSIONS;
|
||||
for (int i = 0; i < DIMENSIONS; i++) {
|
||||
dst_data[base_index + i] = int(round(v.vertex_data[i]));
|
||||
}
|
||||
#else
|
||||
uint base_index = dst_offset + index * DIMENSIONS;
|
||||
uint base_index = shader_data.dst_offset + index * DIMENSIONS;
|
||||
for (int i = 0; i < DIMENSIONS; i++) {
|
||||
dst_data[base_index + i] = v.vertex_data[i];
|
||||
}
|
||||
@@ -168,21 +143,22 @@ uint get_polygon_corner_index(uint coarse_face, uint patch_index)
|
||||
|
||||
uint get_loop_start(uint coarse_face)
|
||||
{
|
||||
return extra_coarse_face_data[coarse_face] & coarse_face_loopstart_mask;
|
||||
return extra_coarse_face_data[coarse_face] & shader_data.coarse_face_loopstart_mask;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
/* We execute for each quad. */
|
||||
uint quad_index = get_global_invocation_index();
|
||||
if (quad_index >= total_dispatch_size) {
|
||||
if (quad_index >= shader_data.total_dispatch_size) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint start_loop_index = quad_index * 4;
|
||||
|
||||
/* Find which coarse polygon we came from. */
|
||||
uint coarse_face = coarse_face_index_from_subdiv_quad_index(quad_index, coarse_face_count);
|
||||
uint coarse_face = coarse_face_index_from_subdiv_quad_index(quad_index,
|
||||
shader_data.coarse_face_count);
|
||||
uint loop_start = get_loop_start(coarse_face);
|
||||
|
||||
/* Find the number of vertices for the coarse polygon. */
|
||||
|
||||
@@ -116,6 +116,38 @@ GPU_SHADER_CREATE_END()
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Custom data
|
||||
* \{ */
|
||||
|
||||
#define SUBDIV_CUSTOM_DATA_VARIANT(suffix, gpu_comp_type, data_type, dimension) \
|
||||
GPU_SHADER_CREATE_INFO(subdiv_custom_data_interp_##suffix) \
|
||||
DO_STATIC_COMPILATION() \
|
||||
DEFINE(gpu_comp_type) \
|
||||
DEFINE(dimension) \
|
||||
COMPUTE_SOURCE("subdiv_custom_data_interp_comp.glsl") \
|
||||
STORAGE_BUF(CUSTOM_DATA_FACE_PTEX_OFFSET_BUF_SLOT, READ, uint, face_ptex_offset[]) \
|
||||
STORAGE_BUF(CUSTOM_DATA_PATCH_COORDS_BUF_SLOT, READ, BlenderPatchCoord, patch_coords[]) \
|
||||
STORAGE_BUF(CUSTOM_DATA_EXTRA_COARSE_FACE_DATA_BUF_SLOT, READ, uint, extra_coarse_face_data[]) \
|
||||
STORAGE_BUF(CUSTOM_DATA_SOURCE_DATA_BUF_SLOT, READ, data_type, src_data[]) \
|
||||
STORAGE_BUF(CUSTOM_DATA_DESTINATION_DATA_BUF_SLOT, WRITE, data_type, dst_data[]) \
|
||||
ADDITIONAL_INFO(subdiv_polygon_offset_base) \
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(4d_u16, "GPU_COMP_U16", uint, "DIMENSIONS_4")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(1d_i32, "GPU_COMP_I32", int, "DIMENSIONS_1")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(2d_i32, "GPU_COMP_I32", int, "DIMENSIONS_2")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(3d_i32, "GPU_COMP_I32", int, "DIMENSIONS_3")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(4d_i32, "GPU_COMP_I32", int, "DIMENSIONS_4")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(1d_f32, "GPU_COMP_F32", float, "DIMENSIONS_1")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(2d_f32, "GPU_COMP_F32", float, "DIMENSIONS_2")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(3d_f32, "GPU_COMP_F32", float, "DIMENSIONS_3")
|
||||
SUBDIV_CUSTOM_DATA_VARIANT(4d_f32, "GPU_COMP_F32", float, "DIMENSIONS_4")
|
||||
|
||||
#undef SUBDIV_CUSTOM_DATA_VARIANT
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Sculpt data
|
||||
* \{ */
|
||||
|
||||
@@ -62,11 +62,13 @@ uint get_global_invocation_index()
|
||||
return gl_GlobalInvocationID.x + gl_GlobalInvocationID.y * invocations_per_row;
|
||||
}
|
||||
|
||||
#ifndef USE_GPU_SHADER_CREATE_INFO
|
||||
/* Structure for #CompressedPatchCoord. */
|
||||
struct BlenderPatchCoord {
|
||||
int patch_index;
|
||||
uint encoded_uv;
|
||||
};
|
||||
#endif
|
||||
|
||||
vec2 decode_uv(uint encoded_uv)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user