GPU: GLSL compilation as C++ for draw intern shaders
Allow compilation of shaders using C++ for linting and IDE support. Related #127983 Pull Request: https://projects.blender.org/blender/blender/pulls/130193
This commit is contained in:
committed by
Clément Foucault
parent
582ea0eb40
commit
29b3df7504
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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"
|
||||
|
||||
58
source/blender/draw/intern/shaders/CMakeLists.txt
Normal file
58
source/blender/draw/intern/shaders/CMakeLists.txt
Normal file
@@ -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()
|
||||
@@ -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. */
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "gpu_glsl_cpp_stubs.hh"
|
||||
|
||||
float linearrgb_to_srgb(float c)
|
||||
{
|
||||
if (c < 0.0031308) {
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "draw_debug_info.hh"
|
||||
|
||||
SHADER_LIBRARY_CREATE_INFO(draw_debug_draw)
|
||||
|
||||
/**
|
||||
* Debugging drawing library
|
||||
*
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
/** \} */
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
/** \} */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -893,4 +893,4 @@ static inline void groupMemoryBarrier() {}
|
||||
|
||||
#define GLSL_CPP_STUBS
|
||||
|
||||
#include "GPU_shader_shared.hh"
|
||||
#include "GPU_shader_shared_utils.hh"
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user