diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt index 638c43d74f0..7b59b454547 100644 --- a/source/blender/CMakeLists.txt +++ b/source/blender/CMakeLists.txt @@ -146,6 +146,7 @@ add_subdirectory(blenkernel) add_subdirectory(blenlib) add_subdirectory(bmesh) add_subdirectory(draw) +add_subdirectory(draw/intern/shaders) add_subdirectory(render) add_subdirectory(blenfont) add_subdirectory(blentranslation) diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 6c6cc7104c3..fe71f0e20ba 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -25,14 +25,6 @@ set(INC ../compositor/realtime_compositor/cached_resources ../windowmanager - # For shader includes - engines/eevee_next/shaders - engines/workbench/shaders - engines/overlay/shaders - intern/shaders - ../gpu/shaders/common - ../gpu/shaders - ../../../intern/opensubdiv ) diff --git a/source/blender/draw/intern/draw_command.cc b/source/blender/draw/intern/draw_command.cc index f1c9c5e665b..7633a7e50cc 100644 --- a/source/blender/draw/intern/draw_command.cc +++ b/source/blender/draw/intern/draw_command.cc @@ -560,7 +560,7 @@ std::string DrawMulti::serialize(const std::string &line_prefix) const std::sort( prototypes.begin(), prototypes.end(), [](const DrawPrototype &a, const DrawPrototype &b) { return (a.group_id < b.group_id) || - (a.group_id == b.group_id && a.resource_handle > b.resource_handle); + (a.group_id == b.group_id && a.res_handle > b.res_handle); }); /* Compute prefix sum to have correct offsets. */ @@ -584,7 +584,7 @@ std::string DrawMulti::serialize(const std::string &line_prefix) const if (grp.back_facing_counter > 0) { for (DrawPrototype &proto : prototypes.slice_safe({offset, grp.back_facing_counter})) { BLI_assert(proto.group_id == group_index); - ResourceHandle handle(proto.resource_handle); + ResourceHandle handle(proto.res_handle); BLI_assert(handle.has_inverted_handedness()); ss << std::endl << line_prefix << " .proto(instance_len=" << std::to_string(proto.instance_len) @@ -596,7 +596,7 @@ std::string DrawMulti::serialize(const std::string &line_prefix) const if (grp.front_facing_counter > 0) { for (DrawPrototype &proto : prototypes.slice_safe({offset, grp.front_facing_counter})) { BLI_assert(proto.group_id == group_index); - ResourceHandle handle(proto.resource_handle); + ResourceHandle handle(proto.res_handle); BLI_assert(!handle.has_inverted_handedness()); ss << std::endl << line_prefix << " .proto(instance_len=" << std::to_string(proto.instance_len) diff --git a/source/blender/draw/intern/draw_command.hh b/source/blender/draw/intern/draw_command.hh index 8675d79014a..b5f7168cbbc 100644 --- a/source/blender/draw/intern/draw_command.hh +++ b/source/blender/draw/intern/draw_command.hh @@ -674,7 +674,7 @@ class DrawMultiBuf { bool inverted = handle.has_inverted_handedness(); DrawPrototype &draw = prototype_buf_.get_or_resize(prototype_count_++); - draw.resource_handle = handle.raw; + draw.res_handle = handle.raw; draw.custom_id = custom_id; draw.instance_len = instance_len; draw.group_id = group_id; diff --git a/source/blender/draw/intern/draw_command_shared.hh b/source/blender/draw/intern/draw_command_shared.hh index c1d16baf33c..1d102619c9e 100644 --- a/source/blender/draw/intern/draw_command_shared.hh +++ b/source/blender/draw/intern/draw_command_shared.hh @@ -91,7 +91,7 @@ struct DrawPrototype { /* Reference to parent DrawGroup to get the gpu::Batch vertex / instance count. */ uint group_id; /* Resource handle associated with this call. Also reference visibility. */ - uint resource_handle; + uint res_handle; /* Custom extra value to be used by the engines. */ uint custom_id; /* Number of instances. */ diff --git a/source/blender/draw/intern/draw_shader_shared.hh b/source/blender/draw/intern/draw_shader_shared.hh index 8f8d4ee0803..93791654639 100644 --- a/source/blender/draw/intern/draw_shader_shared.hh +++ b/source/blender/draw/intern/draw_shader_shared.hh @@ -2,9 +2,9 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#if !defined(GPU_SHADER) && !defined(GLSL_CPP_STUBS) -# pragma once +#pragma once +#if !defined(GPU_SHADER) && !defined(GLSL_CPP_STUBS) # include "GPU_shader.hh" # include "GPU_shader_shared_utils.hh" # include "draw_defines.hh" diff --git a/source/blender/draw/intern/shaders/CMakeLists.txt b/source/blender/draw/intern/shaders/CMakeLists.txt new file mode 100644 index 00000000000..aae1e3bd423 --- /dev/null +++ b/source/blender/draw/intern/shaders/CMakeLists.txt @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2024 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + +set(INC_GLSL + . + .. + + ../../../gpu + ../../../gpu/intern + ../../../gpu/shaders + ../../../gpu/shaders/common +) + +set(SRC_GLSL_VERT + draw_debug_draw_display_vert.glsl +) + +set(SRC_GLSL_FRAG + draw_debug_draw_display_frag.glsl +) + +set(SRC_GLSL_COMP + common_hair_refine_comp.glsl + draw_command_generate_comp.glsl + # Failed because of mixed definition of ObjectInfos + # draw_resource_finalize_comp.glsl + draw_view_finalize_comp.glsl + draw_visibility_comp.glsl +) + +add_definitions(-DGPU_SHADER) +# TODO Remove +add_definitions(-DUSE_GPU_SHADER_CREATE_INFO) + +function(compile_sources_as_cpp + executable + sources + define + ) + + foreach(glsl_file ${sources}) + set_source_files_properties(${glsl_file} PROPERTIES LANGUAGE CXX) + endforeach() + + add_library(${executable} OBJECT ${sources}) + set_target_properties(${executable} PROPERTIES LINKER_LANGUAGE CXX) + target_include_directories(${executable} PUBLIC ${INC_GLSL}) + target_compile_definitions(${executable} PRIVATE ${define}) +endfunction() + + +# Compile shaders with shader code. +if (WITH_GPU_SHADER_CPP_COMPILATION) + compile_sources_as_cpp(draw_cpp_shaders_vert "${SRC_GLSL_VERT}" "GPU_VERTEX_SHADER") + compile_sources_as_cpp(draw_cpp_shaders_frag "${SRC_GLSL_FRAG}" "GPU_FRAGMENT_SHADER") + compile_sources_as_cpp(draw_cpp_shaders_comp "${SRC_GLSL_COMP}" "GPU_COMPUTE_SHADER") +endif() diff --git a/source/blender/draw/intern/shaders/common_attribute_lib.glsl b/source/blender/draw/intern/shaders/common_attribute_lib.glsl index c9aa94f1858..dcb6d3968f4 100644 --- a/source/blender/draw/intern/shaders/common_attribute_lib.glsl +++ b/source/blender/draw/intern/shaders/common_attribute_lib.glsl @@ -4,6 +4,8 @@ #pragma once +#include "gpu_glsl_cpp_stubs.hh" + /* Prototype of functions to implement to load attributes data. * Implementation changes based on object data type. */ diff --git a/source/blender/draw/intern/shaders/common_colormanagement_lib.glsl b/source/blender/draw/intern/shaders/common_colormanagement_lib.glsl index 50090fc471c..fcec1242a77 100644 --- a/source/blender/draw/intern/shaders/common_colormanagement_lib.glsl +++ b/source/blender/draw/intern/shaders/common_colormanagement_lib.glsl @@ -4,6 +4,8 @@ #pragma once +#include "gpu_glsl_cpp_stubs.hh" + float linearrgb_to_srgb(float c) { if (c < 0.0031308) { diff --git a/source/blender/draw/intern/shaders/common_debug_draw_lib.glsl b/source/blender/draw/intern/shaders/common_debug_draw_lib.glsl index cd0511b5523..e2c3f770bd2 100644 --- a/source/blender/draw/intern/shaders/common_debug_draw_lib.glsl +++ b/source/blender/draw/intern/shaders/common_debug_draw_lib.glsl @@ -4,6 +4,10 @@ #pragma once +#include "draw_debug_info.hh" + +SHADER_LIBRARY_CREATE_INFO(draw_debug_draw) + /** * Debugging drawing library * diff --git a/source/blender/draw/intern/shaders/common_fullscreen_vert.glsl b/source/blender/draw/intern/shaders/common_fullscreen_vert.glsl index 85e5dbbcf23..8be7b45feb8 100644 --- a/source/blender/draw/intern/shaders/common_fullscreen_vert.glsl +++ b/source/blender/draw/intern/shaders/common_fullscreen_vert.glsl @@ -2,9 +2,9 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#ifndef USE_GPU_SHADER_CREATE_INFO -out vec4 uvcoordsvar; -#endif +#include "draw_fullscreen_info.hh" + +VERTEX_SHADER_CREATE_INFO(draw_fullscreen) void main() { diff --git a/source/blender/draw/intern/shaders/common_hair_lib.glsl b/source/blender/draw/intern/shaders/common_hair_lib.glsl index 503994181ef..8e762681028 100644 --- a/source/blender/draw/intern/shaders/common_hair_lib.glsl +++ b/source/blender/draw/intern/shaders/common_hair_lib.glsl @@ -4,6 +4,8 @@ #pragma once +#include "draw_object_infos_info.hh" + /** * Library to create hairs dynamically from control points. * This is less bandwidth intensive than fetching the vertex attributes @@ -75,31 +77,35 @@ uniform usamplerBuffer hairStrandSegBuffer; /* R16UI */ * If no more subdivision is needed, we can skip this step. */ +float hair_get_local_time() +{ # ifdef GPU_VERTEX_SHADER -float hair_get_local_time() -{ + VERTEX_SHADER_CREATE_INFO(draw_hair_new) return float(gl_VertexID % hairStrandsRes) / float(hairStrandsRes - 1); -} - -int hair_get_id() -{ - return gl_VertexID / hairStrandsRes; -} -# endif - -# ifdef GPU_COMPUTE_SHADER -float hair_get_local_time() -{ +# elif defined(GPU_COMPUTE_SHADER) + COMPUTE_SHADER_CREATE_INFO(draw_hair_refine_compute) return float(gl_GlobalInvocationID.y) / float(hairStrandsRes - 1); +# else + return 0; +# endif } int hair_get_id() { +# ifdef GPU_VERTEX_SHADER + VERTEX_SHADER_CREATE_INFO(draw_hair_new) + return gl_VertexID / hairStrandsRes; +# elif defined(GPU_COMPUTE_SHADER) + COMPUTE_SHADER_CREATE_INFO(draw_hair_refine_compute) return int(gl_GlobalInvocationID.x) + hairStrandOffset; -} +# else + return 0; # endif +} # ifdef HAIR_PHASE_SUBDIV +COMPUTE_SHADER_CREATE_INFO(draw_hair_refine_compute) + int hair_get_base_id(float local_time, int strand_segments, out float interp_time) { float time_per_strand_seg = 1.0 / float(strand_segments); diff --git a/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl b/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl index 2bde4f2089b..b01ff0b616c 100644 --- a/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl +++ b/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl @@ -2,20 +2,11 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "draw_hair_refine_info.hh" + #include "common_hair_lib.glsl" -#ifndef USE_GPU_SHADER_CREATE_INFO -/* - * To be compiled with common_hair_lib.glsl. - */ - -layout(local_size_x = 1, local_size_y = 1) in; -layout(std430, binding = 0) writeonly buffer hairPointOutputBuffer -{ - vec4 posTime[]; -} -out_vertbuf; -#endif +COMPUTE_SHADER_CREATE_INFO(draw_hair_refine_compute) void main() { diff --git a/source/blender/draw/intern/shaders/common_intersect_lib.glsl b/source/blender/draw/intern/shaders/common_intersect_lib.glsl index cde9e315b0f..685415b59bd 100644 --- a/source/blender/draw/intern/shaders/common_intersect_lib.glsl +++ b/source/blender/draw/intern/shaders/common_intersect_lib.glsl @@ -4,6 +4,8 @@ #pragma once +#include "draw_view_info.hh" + /** * Intersection library used for culling. * Results are meant to be conservative. @@ -132,6 +134,8 @@ IsectFrustum isect_frustum_setup(Frustum shape) /** \name View Intersection functions. * \{ */ +SHADER_LIBRARY_CREATE_INFO(draw_view_culling) + #ifdef DRW_VIEW_CULLING_INFO bool intersect_view(Pyramid pyramid) diff --git a/source/blender/draw/intern/shaders/common_shape_lib.glsl b/source/blender/draw/intern/shaders/common_shape_lib.glsl index 97db28789b8..0120360d0d7 100644 --- a/source/blender/draw/intern/shaders/common_shape_lib.glsl +++ b/source/blender/draw/intern/shaders/common_shape_lib.glsl @@ -4,6 +4,8 @@ #pragma once +#include "gpu_glsl_cpp_stubs.hh" + /** * Geometric shape structures. * Some constructors might seems redundant but are here to make the API cleaner and @@ -202,7 +204,7 @@ struct Cone { vec3 direction; float angle_cos; -#ifdef GPU_METAL +#ifdef __cplusplus inline Cone() = default; inline Cone(vec3 in_direction, float in_angle_cos) : direction(in_direction), angle_cos(in_angle_cos) diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 4fde0eea3f2..a2a51109cd7 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -4,6 +4,8 @@ #pragma once +#include "draw_view_info.hh" + /* WORKAROUND: to guard against double include in EEVEE. */ #ifndef COMMON_VIEW_LIB_GLSL # define COMMON_VIEW_LIB_GLSL diff --git a/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl b/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl index 8795990fc72..b50d98fbc02 100644 --- a/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl +++ b/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl @@ -6,8 +6,12 @@ * Convert DrawPrototype into draw commands. */ +#include "draw_view_info.hh" + #include "common_math_lib.glsl" +COMPUTE_SHADER_CREATE_INFO(draw_command_generate) + #define atomicAddAndGet(dst, val) (atomicAdd(dst, val) + val) /* This is only called by the last thread executed over the group's prototype draws. */ @@ -57,8 +61,8 @@ void main() DrawPrototype proto = prototype_buf[proto_id]; uint group_id = proto.group_id; - bool is_inverted = (proto.resource_handle & 0x80000000u) != 0; - uint resource_index = (proto.resource_handle & 0x7FFFFFFFu); + bool is_inverted = (proto.res_handle & 0x80000000u) != 0; + uint resource_index = (proto.res_handle & 0x7FFFFFFFu); /* Visibility test result. */ uint visible_instance_len = 0; diff --git a/source/blender/draw/intern/shaders/draw_debug_draw_display_frag.glsl b/source/blender/draw/intern/shaders/draw_debug_draw_display_frag.glsl index 5fea2311f83..4f9e1de194a 100644 --- a/source/blender/draw/intern/shaders/draw_debug_draw_display_frag.glsl +++ b/source/blender/draw/intern/shaders/draw_debug_draw_display_frag.glsl @@ -6,6 +6,10 @@ * Display debug edge list. */ +#include "draw_debug_info.hh" + +FRAGMENT_SHADER_CREATE_INFO(draw_debug_draw_display) + void main() { out_color = interp.color; diff --git a/source/blender/draw/intern/shaders/draw_debug_draw_display_vert.glsl b/source/blender/draw/intern/shaders/draw_debug_draw_display_vert.glsl index 92d284bbf2b..07588a43370 100644 --- a/source/blender/draw/intern/shaders/draw_debug_draw_display_vert.glsl +++ b/source/blender/draw/intern/shaders/draw_debug_draw_display_vert.glsl @@ -6,6 +6,10 @@ * Display debug edge list. */ +#include "draw_debug_info.hh" + +VERTEX_SHADER_CREATE_INFO(draw_debug_draw_display) + void main() { /* Skip the first vertex containing header data. */ diff --git a/source/blender/draw/intern/shaders/draw_debug_info.hh b/source/blender/draw/intern/shaders/draw_debug_info.hh index 846da0dbaaa..58e90fff905 100644 --- a/source/blender/draw/intern/shaders/draw_debug_info.hh +++ b/source/blender/draw/intern/shaders/draw_debug_info.hh @@ -2,6 +2,14 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#ifdef GPU_SHADER +# pragma once +# include "gpu_glsl_cpp_stubs.hh" + +# include "draw_shader_shared.hh" +# define DRW_DEBUG_DRAW +#endif + #include "draw_defines.hh" #include "gpu_shader_create_info.hh" diff --git a/source/blender/draw/intern/shaders/draw_fullscreen_info.hh b/source/blender/draw/intern/shaders/draw_fullscreen_info.hh index e117f80c2b5..07ebbce3da0 100644 --- a/source/blender/draw/intern/shaders/draw_fullscreen_info.hh +++ b/source/blender/draw/intern/shaders/draw_fullscreen_info.hh @@ -2,6 +2,11 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#ifdef GPU_SHADER +# pragma once +# include "gpu_glsl_cpp_stubs.hh" +#endif + #include "gpu_shader_create_info.hh" GPU_SHADER_INTERFACE_INFO(fullscreen_iface) diff --git a/source/blender/draw/intern/shaders/draw_hair_refine_info.hh b/source/blender/draw/intern/shaders/draw_hair_refine_info.hh index d6b7afd1fd2..eb5a4c73971 100644 --- a/source/blender/draw/intern/shaders/draw_hair_refine_info.hh +++ b/source/blender/draw/intern/shaders/draw_hair_refine_info.hh @@ -6,6 +6,15 @@ * \ingroup draw */ +#ifdef GPU_SHADER +# pragma once +# include "gpu_glsl_cpp_stubs.hh" + +# define HAIR_PHASE_SUBDIV +# define HAIR_SHADER +# define DRW_HAIR_INFO +#endif + #include "gpu_shader_create_info.hh" GPU_SHADER_CREATE_INFO(draw_hair_refine_compute) diff --git a/source/blender/draw/intern/shaders/draw_model_lib.glsl b/source/blender/draw/intern/shaders/draw_model_lib.glsl index 5dac14408cb..48cd86908c8 100644 --- a/source/blender/draw/intern/shaders/draw_model_lib.glsl +++ b/source/blender/draw/intern/shaders/draw_model_lib.glsl @@ -4,8 +4,12 @@ #pragma once +#include "draw_view_info.hh" + #include "draw_view_lib.glsl" +SHADER_LIBRARY_CREATE_INFO(draw_modelmat_new) + #if !defined(DRAW_MODELMAT_CREATE_INFO) && !defined(GLSL_CPP_STUBS) # error Missing draw_modelmat additional create info on shader create info #endif @@ -16,6 +20,7 @@ # define DRW_RESOURCE_ID_VARYING_SET #elif defined(GPU_VERTEX_SHADER) +VERTEX_SHADER_CREATE_INFO(draw_resource_id_varying) # if defined(UNIFORM_RESOURCE_ID_NEW) # define resource_id (drw_ResourceID >> DRW_VIEW_SHIFT) # else @@ -27,6 +32,7 @@ # define resource_id drw_ResourceID_iface_in[0].resource_index #elif defined(GPU_FRAGMENT_SHADER) +FRAGMENT_SHADER_CREATE_INFO(draw_resource_id_varying) # define resource_id drw_ResourceID_iface.resource_index #endif diff --git a/source/blender/draw/intern/shaders/draw_object_infos_info.hh b/source/blender/draw/intern/shaders/draw_object_infos_info.hh index 38d0dc9cde0..a03696e5088 100644 --- a/source/blender/draw/intern/shaders/draw_object_infos_info.hh +++ b/source/blender/draw/intern/shaders/draw_object_infos_info.hh @@ -2,6 +2,15 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#ifdef GPU_SHADER +# pragma once +# include "gpu_glsl_cpp_stubs.hh" + +# include "draw_shader_shared.hh" + +# include "draw_view_info.hh" +#endif + #include "draw_defines.hh" #include "gpu_shader_create_info.hh" @@ -52,3 +61,108 @@ DEFINE_VALUE("ObjectAttributeLen", "(drw_infos[resource_id].orco_mul_bias[1].w)" STORAGE_BUF(DRW_OBJ_ATTR_SLOT, READ, ObjectAttribute, drw_attrs[]) ADDITIONAL_INFO(draw_object_infos_new) GPU_SHADER_CREATE_END() + +/* -------------------------------------------------------------------- */ +/** \name Geometry Type + * \{ */ + +GPU_SHADER_CREATE_INFO(draw_mesh) +ADDITIONAL_INFO(draw_modelmat) +ADDITIONAL_INFO(draw_resource_id) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_mesh_new) +ADDITIONAL_INFO(draw_modelmat_new) +ADDITIONAL_INFO(draw_resource_id) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_hair) +DEFINE("HAIR_SHADER") +DEFINE("DRW_HAIR_INFO") +SAMPLER(15, FLOAT_BUFFER, hairPointBuffer) +/* TODO(@fclem): Pack these into one UBO. */ +PUSH_CONSTANT(INT, hairStrandsRes) +PUSH_CONSTANT(INT, hairThicknessRes) +PUSH_CONSTANT(FLOAT, hairRadRoot) +PUSH_CONSTANT(FLOAT, hairRadTip) +PUSH_CONSTANT(FLOAT, hairRadShape) +PUSH_CONSTANT(BOOL, hairCloseTip) +PUSH_CONSTANT(INT, hairStrandOffset) +PUSH_CONSTANT(MAT4, hairDupliMatrix) +ADDITIONAL_INFO(draw_modelmat) +ADDITIONAL_INFO(draw_resource_id) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_hair_new) +DEFINE("HAIR_SHADER") +DEFINE("DRW_HAIR_INFO") +SAMPLER(0, FLOAT_BUFFER, hairPointBuffer) +/* TODO(@fclem): Pack these into one UBO. */ +PUSH_CONSTANT(INT, hairStrandsRes) +PUSH_CONSTANT(INT, hairThicknessRes) +PUSH_CONSTANT(FLOAT, hairRadRoot) +PUSH_CONSTANT(FLOAT, hairRadTip) +PUSH_CONSTANT(FLOAT, hairRadShape) +PUSH_CONSTANT(BOOL, hairCloseTip) +PUSH_CONSTANT(INT, hairStrandOffset) +PUSH_CONSTANT(MAT4, hairDupliMatrix) +GPU_SHADER_CREATE_END() + +#ifndef GPU_SHADER /* Conflicts with define for C++ shader test. */ +GPU_SHADER_CREATE_INFO(draw_pointcloud) +SAMPLER_FREQ(0, FLOAT_BUFFER, ptcloud_pos_rad_tx, BATCH) +DEFINE("POINTCLOUD_SHADER") +DEFINE("DRW_POINTCLOUD_INFO") +ADDITIONAL_INFO(draw_modelmat_instanced_attr) +ADDITIONAL_INFO(draw_resource_id_uniform) +GPU_SHADER_CREATE_END() +#endif + +GPU_SHADER_CREATE_INFO(draw_pointcloud_new) +SAMPLER_FREQ(0, FLOAT_BUFFER, ptcloud_pos_rad_tx, BATCH) +DEFINE("POINTCLOUD_SHADER") +DEFINE("DRW_POINTCLOUD_INFO") +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_volume) +ADDITIONAL_INFO(draw_modelmat) +ADDITIONAL_INFO(draw_resource_id_uniform) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_volume_new) +ADDITIONAL_INFO(draw_modelmat_new) +ADDITIONAL_INFO(draw_resource_handle_new) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_gpencil) +TYPEDEF_SOURCE("gpencil_shader_shared.h") +DEFINE("DRW_GPENCIL_INFO") +SAMPLER(0, FLOAT_BUFFER, gp_pos_tx) +SAMPLER(1, FLOAT_BUFFER, gp_col_tx) +/* Per Object */ +PUSH_CONSTANT(FLOAT, gpThicknessScale) /* TODO(fclem): Replace with object info. */ +PUSH_CONSTANT(FLOAT, gpThicknessWorldScale) /* TODO(fclem): Same as above. */ +DEFINE_VALUE("gpThicknessIsScreenSpace", "(gpThicknessWorldScale < 0.0)") +/* Per Layer */ +PUSH_CONSTANT(FLOAT, gpThicknessOffset) +ADDITIONAL_INFO(draw_modelmat) +ADDITIONAL_INFO(draw_object_infos) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_gpencil_new) +TYPEDEF_SOURCE("gpencil_shader_shared.h") +DEFINE("DRW_GPENCIL_INFO") +SAMPLER(0, FLOAT_BUFFER, gp_pos_tx) +SAMPLER(1, FLOAT_BUFFER, gp_col_tx) +/* Per Object */ +PUSH_CONSTANT(FLOAT, gpThicknessScale) /* TODO(fclem): Replace with object info. */ +PUSH_CONSTANT(FLOAT, gpThicknessWorldScale) /* TODO(fclem): Same as above. */ +DEFINE_VALUE("gpThicknessIsScreenSpace", "(gpThicknessWorldScale < 0.0)") +/* Per Layer */ +PUSH_CONSTANT(FLOAT, gpThicknessOffset) +ADDITIONAL_INFO(draw_resource_id_varying) +ADDITIONAL_INFO(draw_view) +ADDITIONAL_INFO(draw_object_infos_new) +GPU_SHADER_CREATE_END() + +/** \} */ diff --git a/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl b/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl index f23a1639769..e3f0a6b7ce7 100644 --- a/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl +++ b/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl @@ -6,6 +6,8 @@ * Finish computation of a few draw resource after sync. */ +#include "draw_view_info.hh" + #include "gpu_shader_math_matrix_lib.glsl" #include "gpu_shader_math_vector_lib.glsl" diff --git a/source/blender/draw/intern/shaders/draw_view_finalize_comp.glsl b/source/blender/draw/intern/shaders/draw_view_finalize_comp.glsl index 4eba15ad499..7b3beecbb3b 100644 --- a/source/blender/draw/intern/shaders/draw_view_finalize_comp.glsl +++ b/source/blender/draw/intern/shaders/draw_view_finalize_comp.glsl @@ -6,6 +6,8 @@ * Compute culling data for each views of a given view buffer. */ +#include "draw_view_info.hh" + #include "common_math_lib.glsl" COMPUTE_SHADER_CREATE_INFO(draw_view_finalize) diff --git a/source/blender/draw/intern/shaders/draw_view_info.hh b/source/blender/draw/intern/shaders/draw_view_info.hh index fddba892ba4..b364e93d148 100644 --- a/source/blender/draw/intern/shaders/draw_view_info.hh +++ b/source/blender/draw/intern/shaders/draw_view_info.hh @@ -3,276 +3,34 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "draw_defines.hh" + +#ifdef GPU_SHADER +# pragma once +# include "gpu_glsl_cpp_stubs.hh" + +# include "draw_command_shared.hh" +# include "draw_common_shader_shared.hh" +# include "draw_shader_shared.hh" + +/* Define stub defines for C++ test compilation. */ +# define DYNAMIC_RESOURCE_ID +# define DRAW_VIEW_CREATE_INFO +# define DRW_VIEW_CULLING_INFO +# define DRW_LEGACY_MODEL_MATRIX + +# define drw_ModelMatrix drw_matrix_buf[resource_id].model +# define drw_ModelMatrixInverse drw_matrix_buf[resource_id].model_inverse +# define drw_view drw_view_[drw_view_id] +# define drw_view_culling drw_view_culling_[drw_view_id] +# define DRW_VIEW_LEN DRW_VIEW_MAX +# define gpThicknessIsScreenSpace (gpThicknessWorldScale < 0.0) +# define ModelMatrix drw_ModelMatrix +# define ModelMatrixInverse drw_ModelMatrixInverse +# define resource_handle drw_ResourceID +#endif + #include "gpu_shader_create_info.hh" -/* -------------------------------------------------------------------- */ -/** \name Resource ID - * - * This is used to fetch per object data in drw_matrices and other object indexed - * buffers. There is multiple possibilities depending on how we are drawing the object. - * - * \{ */ - -/* Standard way. Use gpu_InstanceIndex to index the object data. */ -GPU_SHADER_CREATE_INFO(draw_resource_id) -DEFINE("DYNAMIC_RESOURCE_ID") -GPU_SHADER_CREATE_END() - -/** - * Used if the resource index needs to be passed to the fragment shader. - * IMPORTANT: Vertex and Geometry shaders need to use PASS_RESOURCE_ID in main(). - */ -GPU_SHADER_NAMED_INTERFACE_INFO(draw_resource_id_iface, drw_ResourceID_iface) -FLAT(INT, resource_index) -GPU_SHADER_NAMED_INTERFACE_END(drw_ResourceID_iface) - -GPU_SHADER_CREATE_INFO(draw_resource_id_varying) -VERTEX_OUT(draw_resource_id_iface) -GEOMETRY_OUT(draw_resource_id_iface) -GPU_SHADER_CREATE_END() /* Used if needed. */ - -/* Variation used when drawing multiple instances for one object. */ -GPU_SHADER_CREATE_INFO(draw_resource_id_uniform) -DEFINE("UNIFORM_RESOURCE_ID") -PUSH_CONSTANT(INT, drw_ResourceID) -GPU_SHADER_CREATE_END() - -/** - * Declare a resource handle that identify a unique object. - * Requires draw_resource_id[_uniform]. - */ -GPU_SHADER_CREATE_INFO(draw_resource_handle) -DEFINE_VALUE("resource_handle", "(drw_resourceChunk * DRW_RESOURCE_CHUNK_LEN + resource_id)") -PUSH_CONSTANT(INT, drw_resourceChunk) -GPU_SHADER_CREATE_END() - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Draw View - * \{ */ - -GPU_SHADER_CREATE_INFO(draw_view) -UNIFORM_BUF_FREQ(DRW_VIEW_UBO_SLOT, ViewMatrices, drw_view_[DRW_VIEW_LEN], PASS) -DEFINE("DRAW_VIEW_CREATE_INFO") -DEFINE_VALUE("drw_view", "drw_view_[drw_view_id]") -TYPEDEF_SOURCE("draw_shader_shared.hh") -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_view_culling) -UNIFORM_BUF(DRW_VIEW_CULLING_UBO_SLOT, ViewCullingData, drw_view_culling_[DRW_VIEW_LEN]) -DEFINE("DRW_VIEW_CULLING_INFO") -DEFINE_VALUE("drw_view_culling", "drw_view_culling_[drw_view_id]") -TYPEDEF_SOURCE("draw_shader_shared.hh") -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_modelmat) -UNIFORM_BUF_FREQ(DRW_OBJ_MAT_UBO_SLOT, ObjectMatrices, drw_matrices[DRW_RESOURCE_CHUNK_LEN], BATCH) -DEFINE_VALUE("ModelMatrix", "(drw_matrices[resource_id].model)") -DEFINE_VALUE("ModelMatrixInverse", "(drw_matrices[resource_id].model_inverse)") -ADDITIONAL_INFO(draw_view) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_modelmat_legacy) -DEFINE("DRW_LEGACY_MODEL_MATRIX") -PUSH_CONSTANT(MAT4, ModelMatrix) -PUSH_CONSTANT(MAT4, ModelMatrixInverse) -ADDITIONAL_INFO(draw_view) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_modelmat_instanced_attr) -PUSH_CONSTANT(MAT4, ModelMatrix) -PUSH_CONSTANT(MAT4, ModelMatrixInverse) -ADDITIONAL_INFO(draw_view) -GPU_SHADER_CREATE_END() - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Draw View - * \{ */ - -GPU_SHADER_CREATE_INFO(drw_clipped) -/* TODO(fclem): Move to engine side. */ -UNIFORM_BUF_FREQ(DRW_CLIPPING_UBO_SLOT, vec4, drw_clipping_[6], PASS) -DEFINE("USE_WORLD_CLIP_PLANES") -GPU_SHADER_CREATE_END() - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Draw Globals - * \{ */ - -GPU_SHADER_CREATE_INFO(draw_globals) -TYPEDEF_SOURCE("draw_common_shader_shared.hh") -UNIFORM_BUF_FREQ(7, GlobalsUboStorage, globalsBlock, PASS) -GPU_SHADER_CREATE_END() - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Geometry Type - * \{ */ - -GPU_SHADER_CREATE_INFO(draw_mesh) -ADDITIONAL_INFO(draw_modelmat) -ADDITIONAL_INFO(draw_resource_id) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_mesh_new) -ADDITIONAL_INFO(draw_modelmat_new) -ADDITIONAL_INFO(draw_resource_id) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_hair) -DEFINE("HAIR_SHADER") -DEFINE("DRW_HAIR_INFO") -SAMPLER(15, FLOAT_BUFFER, hairPointBuffer) -/* TODO(@fclem): Pack these into one UBO. */ -PUSH_CONSTANT(INT, hairStrandsRes) -PUSH_CONSTANT(INT, hairThicknessRes) -PUSH_CONSTANT(FLOAT, hairRadRoot) -PUSH_CONSTANT(FLOAT, hairRadTip) -PUSH_CONSTANT(FLOAT, hairRadShape) -PUSH_CONSTANT(BOOL, hairCloseTip) -PUSH_CONSTANT(INT, hairStrandOffset) -PUSH_CONSTANT(MAT4, hairDupliMatrix) -ADDITIONAL_INFO(draw_modelmat) -ADDITIONAL_INFO(draw_resource_id) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_hair_new) -DEFINE("HAIR_SHADER") -DEFINE("DRW_HAIR_INFO") -SAMPLER(0, FLOAT_BUFFER, hairPointBuffer) -/* TODO(@fclem): Pack these into one UBO. */ -PUSH_CONSTANT(INT, hairStrandsRes) -PUSH_CONSTANT(INT, hairThicknessRes) -PUSH_CONSTANT(FLOAT, hairRadRoot) -PUSH_CONSTANT(FLOAT, hairRadTip) -PUSH_CONSTANT(FLOAT, hairRadShape) -PUSH_CONSTANT(BOOL, hairCloseTip) -PUSH_CONSTANT(INT, hairStrandOffset) -PUSH_CONSTANT(MAT4, hairDupliMatrix) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_pointcloud) -SAMPLER_FREQ(0, FLOAT_BUFFER, ptcloud_pos_rad_tx, BATCH) -DEFINE("POINTCLOUD_SHADER") -DEFINE("DRW_POINTCLOUD_INFO") -ADDITIONAL_INFO(draw_modelmat_instanced_attr) -ADDITIONAL_INFO(draw_resource_id_uniform) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_pointcloud_new) -SAMPLER_FREQ(0, FLOAT_BUFFER, ptcloud_pos_rad_tx, BATCH) -DEFINE("POINTCLOUD_SHADER") -DEFINE("DRW_POINTCLOUD_INFO") -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_volume) -ADDITIONAL_INFO(draw_modelmat) -ADDITIONAL_INFO(draw_resource_id_uniform) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_volume_new) -ADDITIONAL_INFO(draw_modelmat_new) -ADDITIONAL_INFO(draw_resource_handle_new) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_gpencil) -TYPEDEF_SOURCE("gpencil_shader_shared.h") -DEFINE("DRW_GPENCIL_INFO") -SAMPLER(0, FLOAT_BUFFER, gp_pos_tx) -SAMPLER(1, FLOAT_BUFFER, gp_col_tx) -/* Per Object */ -PUSH_CONSTANT(FLOAT, gpThicknessScale) /* TODO(fclem): Replace with object info. */ -PUSH_CONSTANT(FLOAT, gpThicknessWorldScale) /* TODO(fclem): Same as above. */ -DEFINE_VALUE("gpThicknessIsScreenSpace", "(gpThicknessWorldScale < 0.0)") -/* Per Layer */ -PUSH_CONSTANT(FLOAT, gpThicknessOffset) -ADDITIONAL_INFO(draw_modelmat) -ADDITIONAL_INFO(draw_object_infos) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_gpencil_new) -TYPEDEF_SOURCE("gpencil_shader_shared.h") -DEFINE("DRW_GPENCIL_INFO") -SAMPLER(0, FLOAT_BUFFER, gp_pos_tx) -SAMPLER(1, FLOAT_BUFFER, gp_col_tx) -/* Per Object */ -PUSH_CONSTANT(FLOAT, gpThicknessScale) /* TODO(fclem): Replace with object info. */ -PUSH_CONSTANT(FLOAT, gpThicknessWorldScale) /* TODO(fclem): Same as above. */ -DEFINE_VALUE("gpThicknessIsScreenSpace", "(gpThicknessWorldScale < 0.0)") -/* Per Layer */ -PUSH_CONSTANT(FLOAT, gpThicknessOffset) -ADDITIONAL_INFO(draw_resource_id_varying) -ADDITIONAL_INFO(draw_view) -ADDITIONAL_INFO(draw_object_infos_new) -GPU_SHADER_CREATE_END() - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Internal Draw Manager usage - * \{ */ - -GPU_SHADER_CREATE_INFO(draw_resource_finalize) -DO_STATIC_COMPILATION() -TYPEDEF_SOURCE("draw_shader_shared.hh") -DEFINE("DRAW_FINALIZE_SHADER") -LOCAL_GROUP_SIZE(DRW_FINALIZE_GROUP_SIZE) -STORAGE_BUF(0, READ, ObjectMatrices, matrix_buf[]) -STORAGE_BUF(1, READ_WRITE, ObjectBounds, bounds_buf[]) -STORAGE_BUF(2, READ_WRITE, ObjectInfos, infos_buf[]) -PUSH_CONSTANT(INT, resource_len) -COMPUTE_SOURCE("draw_resource_finalize_comp.glsl") -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_view_finalize) -DO_STATIC_COMPILATION() -LOCAL_GROUP_SIZE(DRW_VIEW_MAX) -DEFINE_VALUE("DRW_VIEW_LEN", STRINGIFY(DRW_VIEW_MAX)) -STORAGE_BUF(0, READ_WRITE, ViewCullingData, view_culling_buf[DRW_VIEW_LEN]) -COMPUTE_SOURCE("draw_view_finalize_comp.glsl") -ADDITIONAL_INFO(draw_view) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_visibility_compute) -DO_STATIC_COMPILATION() -LOCAL_GROUP_SIZE(DRW_VISIBILITY_GROUP_SIZE) -DEFINE_VALUE("DRW_VIEW_LEN", STRINGIFY(DRW_VIEW_MAX)) -STORAGE_BUF(0, READ, ObjectBounds, bounds_buf[]) -STORAGE_BUF(1, READ_WRITE, uint, visibility_buf[]) -PUSH_CONSTANT(INT, resource_len) -PUSH_CONSTANT(INT, view_len) -PUSH_CONSTANT(INT, visibility_word_per_draw) -COMPUTE_SOURCE("draw_visibility_comp.glsl") -ADDITIONAL_INFO(draw_view) -ADDITIONAL_INFO(draw_view_culling) -GPU_SHADER_CREATE_END() - -GPU_SHADER_CREATE_INFO(draw_command_generate) -DO_STATIC_COMPILATION() -TYPEDEF_SOURCE("draw_shader_shared.hh") -TYPEDEF_SOURCE("draw_command_shared.hh") -LOCAL_GROUP_SIZE(DRW_COMMAND_GROUP_SIZE) -STORAGE_BUF(0, READ_WRITE, DrawGroup, group_buf[]) -STORAGE_BUF(1, READ, uint, visibility_buf[]) -STORAGE_BUF(2, READ, DrawPrototype, prototype_buf[]) -STORAGE_BUF(3, WRITE, DrawCommand, command_buf[]) -STORAGE_BUF(DRW_RESOURCE_ID_SLOT, WRITE, uint, resource_id_buf[]) -PUSH_CONSTANT(INT, prototype_len) -PUSH_CONSTANT(INT, visibility_word_per_draw) -PUSH_CONSTANT(INT, view_shift) -PUSH_CONSTANT(INT, view_len) -PUSH_CONSTANT(BOOL, use_custom_ids) -COMPUTE_SOURCE("draw_command_generate_comp.glsl") -GPU_SHADER_CREATE_END() - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Draw Resource ID * New implementation using gl_BaseInstance and storage buffers. @@ -343,3 +101,172 @@ ADDITIONAL_INFO(draw_resource_with_custom_id_new) GPU_SHADER_CREATE_END() /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Resource ID + * + * This is used to fetch per object data in drw_matrices and other object indexed + * buffers. There is multiple possibilities depending on how we are drawing the object. + * + * \{ */ + +/* Standard way. Use gpu_InstanceIndex to index the object data. */ +GPU_SHADER_CREATE_INFO(draw_resource_id) +DEFINE("DYNAMIC_RESOURCE_ID") +GPU_SHADER_CREATE_END() + +/** + * Used if the resource index needs to be passed to the fragment shader. + * IMPORTANT: Vertex and Geometry shaders need to use PASS_RESOURCE_ID in main(). + */ +GPU_SHADER_NAMED_INTERFACE_INFO(draw_resource_id_iface, drw_ResourceID_iface) +FLAT(INT, resource_index) +GPU_SHADER_NAMED_INTERFACE_END(drw_ResourceID_iface) + +GPU_SHADER_CREATE_INFO(draw_resource_id_varying) +VERTEX_OUT(draw_resource_id_iface) +GEOMETRY_OUT(draw_resource_id_iface) +GPU_SHADER_CREATE_END() /* Used if needed. */ + +/* Variation used when drawing multiple instances for one object. */ +GPU_SHADER_CREATE_INFO(draw_resource_id_uniform) +DEFINE("UNIFORM_RESOURCE_ID") +PUSH_CONSTANT(INT, drw_ResourceID) +GPU_SHADER_CREATE_END() + +/** + * Declare a resource handle that identify a unique object. + * Requires draw_resource_id[_uniform]. + */ +GPU_SHADER_CREATE_INFO(draw_resource_handle) +DEFINE_VALUE("resource_handle", "(drw_resourceChunk * DRW_RESOURCE_CHUNK_LEN + resource_id)") +PUSH_CONSTANT(INT, drw_resourceChunk) +GPU_SHADER_CREATE_END() + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Draw View + * \{ */ + +GPU_SHADER_CREATE_INFO(draw_view) +UNIFORM_BUF_FREQ(DRW_VIEW_UBO_SLOT, ViewMatrices, drw_view_[DRW_VIEW_LEN], PASS) +DEFINE("DRAW_VIEW_CREATE_INFO") +DEFINE_VALUE("drw_view", "drw_view_[drw_view_id]") +TYPEDEF_SOURCE("draw_shader_shared.hh") +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_view_culling) +UNIFORM_BUF(DRW_VIEW_CULLING_UBO_SLOT, ViewCullingData, drw_view_culling_[DRW_VIEW_LEN]) +DEFINE("DRW_VIEW_CULLING_INFO") +DEFINE_VALUE("drw_view_culling", "drw_view_culling_[drw_view_id]") +TYPEDEF_SOURCE("draw_shader_shared.hh") +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_modelmat) +UNIFORM_BUF_FREQ(DRW_OBJ_MAT_UBO_SLOT, ObjectMatrices, drw_matrices[DRW_RESOURCE_CHUNK_LEN], BATCH) +DEFINE_VALUE("ModelMatrix", "(drw_matrices[resource_id].model)") +DEFINE_VALUE("ModelMatrixInverse", "(drw_matrices[resource_id].model_inverse)") +ADDITIONAL_INFO(draw_view) +GPU_SHADER_CREATE_END() + +#ifndef GPU_SHADER /* Conflicts with define for C++ shader test. */ + +GPU_SHADER_CREATE_INFO(draw_modelmat_legacy) +DEFINE("DRW_LEGACY_MODEL_MATRIX") +PUSH_CONSTANT(MAT4, ModelMatrix) +PUSH_CONSTANT(MAT4, ModelMatrixInverse) +ADDITIONAL_INFO(draw_view) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_modelmat_instanced_attr) +PUSH_CONSTANT(MAT4, ModelMatrix) +PUSH_CONSTANT(MAT4, ModelMatrixInverse) +ADDITIONAL_INFO(draw_view) +GPU_SHADER_CREATE_END() + +#endif + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Draw View + * \{ */ + +GPU_SHADER_CREATE_INFO(drw_clipped) +/* TODO(fclem): Move to engine side. */ +UNIFORM_BUF_FREQ(DRW_CLIPPING_UBO_SLOT, vec4, drw_clipping_[6], PASS) +DEFINE("USE_WORLD_CLIP_PLANES") +GPU_SHADER_CREATE_END() + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Draw Globals + * \{ */ + +GPU_SHADER_CREATE_INFO(draw_globals) +TYPEDEF_SOURCE("draw_common_shader_shared.hh") +UNIFORM_BUF_FREQ(7, GlobalsUboStorage, globalsBlock, PASS) +GPU_SHADER_CREATE_END() + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Internal Draw Manager usage + * \{ */ + +GPU_SHADER_CREATE_INFO(draw_resource_finalize) +DO_STATIC_COMPILATION() +TYPEDEF_SOURCE("draw_shader_shared.hh") +DEFINE("DRAW_FINALIZE_SHADER") +LOCAL_GROUP_SIZE(DRW_FINALIZE_GROUP_SIZE) +STORAGE_BUF(0, READ, ObjectMatrices, matrix_buf[]) +STORAGE_BUF(1, READ_WRITE, ObjectBounds, bounds_buf[]) +STORAGE_BUF(2, READ_WRITE, ObjectInfos, infos_buf[]) +PUSH_CONSTANT(INT, resource_len) +COMPUTE_SOURCE("draw_resource_finalize_comp.glsl") +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_view_finalize) +DO_STATIC_COMPILATION() +LOCAL_GROUP_SIZE(DRW_VIEW_MAX) +DEFINE_VALUE("DRW_VIEW_LEN", STRINGIFY(DRW_VIEW_MAX)) +STORAGE_BUF(0, READ_WRITE, ViewCullingData, view_culling_buf[DRW_VIEW_LEN]) +COMPUTE_SOURCE("draw_view_finalize_comp.glsl") +ADDITIONAL_INFO(draw_view) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_visibility_compute) +DO_STATIC_COMPILATION() +LOCAL_GROUP_SIZE(DRW_VISIBILITY_GROUP_SIZE) +DEFINE_VALUE("DRW_VIEW_LEN", STRINGIFY(DRW_VIEW_MAX)) +STORAGE_BUF(0, READ, ObjectBounds, bounds_buf[]) +STORAGE_BUF(1, READ_WRITE, uint, visibility_buf[]) +PUSH_CONSTANT(INT, resource_len) +PUSH_CONSTANT(INT, view_len) +PUSH_CONSTANT(INT, visibility_word_per_draw) +COMPUTE_SOURCE("draw_visibility_comp.glsl") +ADDITIONAL_INFO(draw_view) +ADDITIONAL_INFO(draw_view_culling) +GPU_SHADER_CREATE_END() + +GPU_SHADER_CREATE_INFO(draw_command_generate) +DO_STATIC_COMPILATION() +TYPEDEF_SOURCE("draw_shader_shared.hh") +TYPEDEF_SOURCE("draw_command_shared.hh") +LOCAL_GROUP_SIZE(DRW_COMMAND_GROUP_SIZE) +STORAGE_BUF(0, READ_WRITE, DrawGroup, group_buf[]) +STORAGE_BUF(1, READ, uint, visibility_buf[]) +STORAGE_BUF(2, READ, DrawPrototype, prototype_buf[]) +STORAGE_BUF(3, WRITE, DrawCommand, command_buf[]) +STORAGE_BUF(DRW_RESOURCE_ID_SLOT, WRITE, uint, resource_id_buf[]) +PUSH_CONSTANT(INT, prototype_len) +PUSH_CONSTANT(INT, visibility_word_per_draw) +PUSH_CONSTANT(INT, view_shift) +PUSH_CONSTANT(INT, view_len) +PUSH_CONSTANT(BOOL, use_custom_ids) +COMPUTE_SOURCE("draw_command_generate_comp.glsl") +GPU_SHADER_CREATE_END() + +/** \} */ diff --git a/source/blender/draw/intern/shaders/draw_view_lib.glsl b/source/blender/draw/intern/shaders/draw_view_lib.glsl index be2896827bb..56aa7927e10 100644 --- a/source/blender/draw/intern/shaders/draw_view_lib.glsl +++ b/source/blender/draw/intern/shaders/draw_view_lib.glsl @@ -4,7 +4,9 @@ #pragma once -#include "gpu_glsl_cpp_stubs.hh" +#include "draw_view_info.hh" + +SHADER_LIBRARY_CREATE_INFO(draw_view) #if !defined(DRAW_VIEW_CREATE_INFO) && !defined(GLSL_CPP_STUBS) # error Missing draw_view additional create info on shader create info diff --git a/source/blender/draw/intern/shaders/draw_visibility_comp.glsl b/source/blender/draw/intern/shaders/draw_visibility_comp.glsl index ff1584d1232..94f5d771958 100644 --- a/source/blender/draw/intern/shaders/draw_visibility_comp.glsl +++ b/source/blender/draw/intern/shaders/draw_visibility_comp.glsl @@ -7,9 +7,10 @@ */ /* TODO(fclem): This could be augmented by a 2 pass occlusion culling system. */ +#include "draw_view_info.hh" + #include "common_intersect_lib.glsl" #include "common_math_lib.glsl" -#include "common_view_lib.glsl" COMPUTE_SHADER_CREATE_INFO(draw_visibility_compute) diff --git a/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh b/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh index 6c1219db1fd..8ffdf713957 100644 --- a/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh +++ b/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh @@ -190,6 +190,10 @@ class Preprocessor { /* Skip GLSL-C++ stubs. They are only for IDE linting. */ return; } + if (dependency_name.find("info.hh") != std::string::npos) { + /* Skip info files. They are only for IDE linting. */ + return; + } dependencies_.emplace_back(dependency_name); }); } diff --git a/source/blender/gpu/shaders/gpu_glsl_cpp_stubs.hh b/source/blender/gpu/shaders/gpu_glsl_cpp_stubs.hh index d4e9dced4c8..cad0e4141f1 100644 --- a/source/blender/gpu/shaders/gpu_glsl_cpp_stubs.hh +++ b/source/blender/gpu/shaders/gpu_glsl_cpp_stubs.hh @@ -893,4 +893,4 @@ static inline void groupMemoryBarrier() {} #define GLSL_CPP_STUBS -#include "GPU_shader_shared.hh" +#include "GPU_shader_shared_utils.hh" diff --git a/source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl b/source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl index 22146adc28d..d15b7902a1f 100644 --- a/source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl +++ b/source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl @@ -20,15 +20,15 @@ FRAGMENT_SHADER_CREATE_INFO(gpu_shader_2D_image_overlays_stereo_merge) bool interlace(ivec2 texel) { int interlace_mode = stereo_interlace_mode; - if (interlace_mode == S3D_INTERLACE_CHECKERBOARD) { - return ((texel.x + texel.y) & 1) != 0; - } - else if (interlace_mode == S3D_INTERLACE_ROW) { - return (texel.y & 1) != 0; - } - else if (interlace_mode == S3D_INTERLACE_COLUMN) { - return (texel.x & 1) != 0; + switch (interlace_mode) { + case S3D_INTERLACE_CHECKERBOARD: + return ((texel.x + texel.y) & 1) != 0; + case S3D_INTERLACE_ROW: + return (texel.y & 1) != 0; + case S3D_INTERLACE_COLUMN: + return (texel.x & 1) != 0; } + return false; } void main()