2023-08-16 00:20:26 +10:00
|
|
|
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
2023-05-31 16:19:06 +02:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2022-01-17 14:45:22 +01:00
|
|
|
|
2024-03-22 23:51:35 -04:00
|
|
|
#include "draw_defines.hh"
|
2024-11-13 12:32:39 +01:00
|
|
|
|
|
|
|
|
#ifdef GPU_SHADER
|
|
|
|
|
# pragma once
|
2025-09-15 17:22:19 +02:00
|
|
|
# include "gpu_shader_compat.hh"
|
2024-11-13 12:32:39 +01:00
|
|
|
|
|
|
|
|
# include "draw_command_shared.hh"
|
|
|
|
|
# include "draw_shader_shared.hh"
|
|
|
|
|
|
|
|
|
|
/* Define stub defines for C++ test compilation. */
|
|
|
|
|
# define DRAW_VIEW_CREATE_INFO
|
|
|
|
|
# define DRW_VIEW_CULLING_INFO
|
2024-11-08 00:15:10 +01:00
|
|
|
# define USE_WORLD_CLIP_PLANES
|
2024-11-13 12:32:39 +01:00
|
|
|
|
|
|
|
|
# define DRW_VIEW_LEN DRW_VIEW_MAX
|
|
|
|
|
#endif
|
|
|
|
|
|
2022-01-17 14:45:22 +01:00
|
|
|
#include "gpu_shader_create_info.hh"
|
|
|
|
|
|
2024-11-13 12:32:39 +01:00
|
|
|
/* -------------------------------------------------------------------- */
|
2025-02-25 23:05:03 +01:00
|
|
|
/** \name Resource ID
|
|
|
|
|
* This is used to fetch per object data in drw_matrices and other object indexed buffers.
|
2024-11-13 12:32:39 +01:00
|
|
|
* \{ */
|
|
|
|
|
|
2025-02-25 23:05:03 +01:00
|
|
|
/**
|
|
|
|
|
* Used if the resource index needs to be passed to the fragment shader.
|
|
|
|
|
* IMPORTANT: Vertex shader need to write `drw_ResourceID_iface.resource_index` in main().
|
|
|
|
|
*/
|
|
|
|
|
GPU_SHADER_NAMED_INTERFACE_INFO(draw_resource_id_iface, drw_ResourceID_iface)
|
2025-04-11 22:39:01 +02:00
|
|
|
FLAT(uint, resource_index)
|
2025-02-25 23:05:03 +01:00
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_resource_id)
|
2025-04-24 14:38:13 +02:00
|
|
|
STORAGE_BUF(DRW_RESOURCE_ID_SLOT, read, uint, resource_id_buf[])
|
2024-11-13 12:32:39 +01:00
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
2025-02-25 23:05:03 +01:00
|
|
|
GPU_SHADER_CREATE_INFO(draw_resource_with_custom_id)
|
2024-11-13 12:32:39 +01:00
|
|
|
DEFINE("WITH_CUSTOM_IDS")
|
2025-04-24 14:38:13 +02:00
|
|
|
STORAGE_BUF(DRW_RESOURCE_ID_SLOT, read, uint2, resource_id_buf[])
|
2024-11-13 12:32:39 +01:00
|
|
|
GPU_SHADER_CREATE_END()
|
|
|
|
|
|
|
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Draw Object Resources
|
|
|
|
|
* \{ */
|
|
|
|
|
|
2025-02-25 23:05:03 +01:00
|
|
|
GPU_SHADER_CREATE_INFO(draw_modelmat_common)
|
2024-11-13 12:32:39 +01:00
|
|
|
TYPEDEF_SOURCE("draw_shader_shared.hh")
|
2025-04-24 14:38:13 +02:00
|
|
|
STORAGE_BUF(DRW_OBJ_MAT_SLOT, read, ObjectMatrices, drw_matrix_buf[])
|
2024-11-13 12:32:39 +01:00
|
|
|
DEFINE("DRAW_MODELMAT_CREATE_INFO")
|
2024-10-04 19:04:40 +02:00
|
|
|
GPU_SHADER_CREATE_END()
|
2022-01-26 12:46:37 +01:00
|
|
|
|
2025-02-25 23:05:03 +01:00
|
|
|
GPU_SHADER_CREATE_INFO(draw_modelmat)
|
|
|
|
|
ADDITIONAL_INFO(draw_modelmat_common)
|
|
|
|
|
ADDITIONAL_INFO(draw_resource_id)
|
2024-10-04 19:04:40 +02:00
|
|
|
GPU_SHADER_CREATE_END()
|
2022-01-26 12:46:37 +01:00
|
|
|
|
2025-02-25 23:05:03 +01:00
|
|
|
GPU_SHADER_CREATE_INFO(draw_modelmat_with_custom_id)
|
|
|
|
|
ADDITIONAL_INFO(draw_modelmat_common)
|
|
|
|
|
ADDITIONAL_INFO(draw_resource_with_custom_id)
|
2024-10-04 19:04:40 +02:00
|
|
|
GPU_SHADER_CREATE_END()
|
2022-01-26 12:46:37 +01:00
|
|
|
|
|
|
|
|
/** \} */
|
|
|
|
|
|
2022-01-17 14:45:22 +01:00
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Draw View
|
|
|
|
|
* \{ */
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_view)
|
2025-03-04 00:45:38 +01:00
|
|
|
UNIFORM_BUF_FREQ(DRW_VIEW_UBO_SLOT, ViewMatrices, drw_view_buf[DRW_VIEW_LEN], PASS)
|
2024-10-04 19:04:40 +02:00
|
|
|
DEFINE("DRAW_VIEW_CREATE_INFO")
|
|
|
|
|
TYPEDEF_SOURCE("draw_shader_shared.hh")
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
2022-01-17 14:45:22 +01:00
|
|
|
|
2022-10-05 21:54:10 +02:00
|
|
|
GPU_SHADER_CREATE_INFO(draw_view_culling)
|
2025-03-04 00:45:38 +01:00
|
|
|
UNIFORM_BUF(DRW_VIEW_CULLING_UBO_SLOT, ViewCullingData, drw_view_culling_buf[DRW_VIEW_LEN])
|
2024-10-04 19:04:40 +02:00
|
|
|
DEFINE("DRW_VIEW_CULLING_INFO")
|
|
|
|
|
TYPEDEF_SOURCE("draw_shader_shared.hh")
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
2022-10-05 21:54:10 +02:00
|
|
|
|
2022-01-17 14:45:22 +01:00
|
|
|
/** \} */
|
|
|
|
|
|
2022-01-26 12:46:37 +01:00
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Draw View
|
|
|
|
|
* \{ */
|
|
|
|
|
|
2022-10-07 00:06:27 +02:00
|
|
|
GPU_SHADER_CREATE_INFO(drw_clipped)
|
2024-10-04 19:04:40 +02:00
|
|
|
/* TODO(fclem): Move to engine side. */
|
2025-04-14 13:46:41 +02:00
|
|
|
UNIFORM_BUF_FREQ(DRW_CLIPPING_UBO_SLOT, float4, drw_clipping_[6], PASS)
|
2024-10-04 19:04:40 +02:00
|
|
|
DEFINE("USE_WORLD_CLIP_PLANES")
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
2022-01-26 12:46:37 +01:00
|
|
|
|
|
|
|
|
/** \} */
|
|
|
|
|
|
2022-09-02 18:30:48 +02:00
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Internal Draw Manager usage
|
|
|
|
|
* \{ */
|
|
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_resource_finalize)
|
2024-10-04 19:04:40 +02:00
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
TYPEDEF_SOURCE("draw_shader_shared.hh")
|
|
|
|
|
DEFINE("DRAW_FINALIZE_SHADER")
|
|
|
|
|
LOCAL_GROUP_SIZE(DRW_FINALIZE_GROUP_SIZE)
|
2025-04-24 14:38:13 +02:00
|
|
|
STORAGE_BUF(0, read, ObjectMatrices, matrix_buf[])
|
|
|
|
|
STORAGE_BUF(1, read_write, ObjectBounds, bounds_buf[])
|
|
|
|
|
STORAGE_BUF(2, read_write, ObjectInfos, infos_buf[])
|
2025-04-11 22:39:01 +02:00
|
|
|
PUSH_CONSTANT(int, resource_len)
|
2024-10-04 19:04:40 +02:00
|
|
|
COMPUTE_SOURCE("draw_resource_finalize_comp.glsl")
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
2022-09-02 18:30:48 +02:00
|
|
|
|
2023-01-18 14:24:25 +01:00
|
|
|
GPU_SHADER_CREATE_INFO(draw_view_finalize)
|
2024-10-04 19:04:40 +02:00
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
LOCAL_GROUP_SIZE(DRW_VIEW_MAX)
|
|
|
|
|
DEFINE_VALUE("DRW_VIEW_LEN", STRINGIFY(DRW_VIEW_MAX))
|
2025-04-24 14:38:13 +02:00
|
|
|
STORAGE_BUF(0, read_write, ViewCullingData, view_culling_buf[DRW_VIEW_LEN])
|
2024-10-04 19:04:40 +02:00
|
|
|
COMPUTE_SOURCE("draw_view_finalize_comp.glsl")
|
|
|
|
|
ADDITIONAL_INFO(draw_view)
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
2023-01-18 14:24:25 +01:00
|
|
|
|
2022-09-02 18:30:48 +02:00
|
|
|
GPU_SHADER_CREATE_INFO(draw_visibility_compute)
|
2024-10-04 19:04:40 +02:00
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
LOCAL_GROUP_SIZE(DRW_VISIBILITY_GROUP_SIZE)
|
|
|
|
|
DEFINE_VALUE("DRW_VIEW_LEN", STRINGIFY(DRW_VIEW_MAX))
|
2025-04-24 14:38:13 +02:00
|
|
|
STORAGE_BUF(0, read, ObjectBounds, bounds_buf[])
|
|
|
|
|
STORAGE_BUF(1, read_write, uint, visibility_buf[])
|
2025-04-11 22:39:01 +02:00
|
|
|
PUSH_CONSTANT(int, resource_len)
|
|
|
|
|
PUSH_CONSTANT(int, view_len)
|
|
|
|
|
PUSH_CONSTANT(int, visibility_word_per_draw)
|
2024-10-04 19:04:40 +02:00
|
|
|
COMPUTE_SOURCE("draw_visibility_comp.glsl")
|
|
|
|
|
ADDITIONAL_INFO(draw_view)
|
|
|
|
|
ADDITIONAL_INFO(draw_view_culling)
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
2022-09-02 18:30:48 +02:00
|
|
|
|
|
|
|
|
GPU_SHADER_CREATE_INFO(draw_command_generate)
|
2024-10-04 19:04:40 +02:00
|
|
|
DO_STATIC_COMPILATION()
|
|
|
|
|
TYPEDEF_SOURCE("draw_shader_shared.hh")
|
|
|
|
|
TYPEDEF_SOURCE("draw_command_shared.hh")
|
|
|
|
|
LOCAL_GROUP_SIZE(DRW_COMMAND_GROUP_SIZE)
|
2025-04-24 14:38:13 +02:00
|
|
|
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[])
|
2025-04-11 22:39:01 +02:00
|
|
|
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)
|
2024-10-04 19:04:40 +02:00
|
|
|
COMPUTE_SOURCE("draw_command_generate_comp.glsl")
|
|
|
|
|
GPU_SHADER_CREATE_END()
|
2022-09-02 18:30:48 +02:00
|
|
|
|
|
|
|
|
/** \} */
|
2024-11-08 00:15:10 +01:00
|
|
|
|
|
|
|
|
/* Stub needs to be after all definitions to avoid conflict with legacy definitions. */
|
|
|
|
|
#ifdef GPU_SHADER
|
2025-02-25 23:05:03 +01:00
|
|
|
/* Make it work for both draw_resource_id and draw_resource_with_custom_id. */
|
2025-04-14 13:46:41 +02:00
|
|
|
# define resource_id_buf float2(0)
|
2024-11-08 00:15:10 +01:00
|
|
|
#endif
|