diff options
Diffstat (limited to 'source/blender/draw/intern')
8 files changed, 215 insertions, 58 deletions
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index f1c13bc039a..ab570667a77 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -1248,6 +1248,17 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader) int chunkid_location = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_RESOURCE_CHUNK); int resourceid_location = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_RESOURCE_ID); + /* TODO(fclem) Will take the place of the above after the GPUShaderCreateInfo port. */ + if (view_ubo_location == -1) { + view_ubo_location = GPU_shader_get_builtin_block(shader, GPU_UNIFORM_BLOCK_DRW_VIEW); + } + if (model_ubo_location == -1) { + model_ubo_location = GPU_shader_get_builtin_block(shader, GPU_UNIFORM_BLOCK_DRW_MODEL); + } + if (info_ubo_location == -1) { + info_ubo_location = GPU_shader_get_builtin_block(shader, GPU_UNIFORM_BLOCK_DRW_INFOS); + } + if (chunkid_location != -1) { drw_shgroup_uniform_create_ex( shgroup, chunkid_location, DRW_UNIFORM_RESOURCE_CHUNK, NULL, 0, 0, 1); diff --git a/source/blender/draw/intern/draw_shader_shared.h b/source/blender/draw/intern/draw_shader_shared.h index aa117f44e84..35350417ca8 100644 --- a/source/blender/draw/intern/draw_shader_shared.h +++ b/source/blender/draw/intern/draw_shader_shared.h @@ -16,7 +16,7 @@ struct ViewInfos { float4x4 winmat; float4x4 wininv; - float4 clipplanes[6]; + float4 clip_planes[6]; float4 viewvecs[2]; /* Should not be here. Not view dependent (only main view). */ float4 viewcamtexcofac; @@ -30,7 +30,7 @@ BLI_STATIC_ASSERT_ALIGN(ViewInfos, 16) #define ViewMatrixInverse drw_view.viewinv #define ProjectionMatrix drw_view.winmat #define ProjectionMatrixInverse drw_view.wininv -#define clipPlanes drw_view.clipplanes +#define clipPlanes drw_view.clip_planes #define ViewVecs drw_view.viewvecs #define CameraTexCoFactors drw_view.viewcamtexcofac @@ -39,3 +39,14 @@ struct ObjectMatrices { float4x4 drw_modelMatrixInverse; }; BLI_STATIC_ASSERT_ALIGN(ViewInfos, 16) + +struct ObjectInfos { + float4 drw_OrcoTexCoFactors[2]; + float4 drw_ObjectColor; + float4 drw_Infos; +}; +BLI_STATIC_ASSERT_ALIGN(ViewInfos, 16) + +#define OrcoTexCoFactors (drw_infos[resource_id].drw_OrcoTexCoFactors) +#define ObjectInfo (drw_infos[resource_id].drw_Infos) +#define ObjectColor (drw_infos[resource_id].drw_ObjectColor) diff --git a/source/blender/draw/intern/shaders/common_hair_lib.glsl b/source/blender/draw/intern/shaders/common_hair_lib.glsl index 049d7785bf7..ed8b8aeb849 100644 --- a/source/blender/draw/intern/shaders/common_hair_lib.glsl +++ b/source/blender/draw/intern/shaders/common_hair_lib.glsl @@ -5,7 +5,9 @@ * of data the CPU has to precompute and transfer for each update. */ +/* TODO(fclem): Keep documentation but remove the uniform declaration. */ #ifndef USE_GPU_SHADER_CREATE_INFO + /** * hairStrandsRes: Number of points per hair strand. * 2 - no subdivision diff --git a/source/blender/draw/intern/shaders/common_smaa_lib.glsl b/source/blender/draw/intern/shaders/common_smaa_lib.glsl index 36ffb4d8b32..73f65fb0799 100644 --- a/source/blender/draw/intern/shaders/common_smaa_lib.glsl +++ b/source/blender/draw/intern/shaders/common_smaa_lib.glsl @@ -736,9 +736,11 @@ float2 SMAALumaEdgeDetectionPS(float2 texcoord, float2 edges = step(threshold, delta.xy); # ifndef SMAA_NO_DISCARD +# ifdef GPU_FRAGMENT_SHADER // Then discard if there is no edge: if (dot(edges, float2(1.0, 1.0)) == 0.0) discard; +# endif # endif // Calculate right and bottom deltas: @@ -804,9 +806,11 @@ float2 SMAAColorEdgeDetectionPS(float2 texcoord, float2 edges = step(threshold, delta.xy); # ifndef SMAA_NO_DISCARD +# ifdef GPU_FRAGMENT_SHADER // Then discard if there is no edge: if (dot(edges, float2(1.0, 1.0)) == 0.0) discard; +# endif # endif // Calculate right and bottom deltas: @@ -851,8 +855,10 @@ float2 SMAADepthEdgeDetectionPS(float2 texcoord, float4 offset[3], SMAATexture2D float2 delta = abs(neighbours.xx - float2(neighbours.y, neighbours.z)); float2 edges = step(SMAA_DEPTH_THRESHOLD, delta); +# ifdef GPU_FRAGMENT_SHADER if (dot(edges, float2(1.0, 1.0)) == 0.0) discard; +# endif return edges; } diff --git a/source/blender/draw/intern/shaders/common_view_clipping_lib.glsl b/source/blender/draw/intern/shaders/common_view_clipping_lib.glsl new file mode 100644 index 00000000000..d55808c42d2 --- /dev/null +++ b/source/blender/draw/intern/shaders/common_view_clipping_lib.glsl @@ -0,0 +1,33 @@ + +#pragma BLENDER_REQUIRE(common_view_lib.glsl) + +#if defined(GPU_VERTEX_SHADER) || defined(GPU_GEOMETRY_SHADER) + +void view_clipping_distances(vec3 wpos) +{ +# ifdef USE_WORLD_CLIP_PLANES + vec4 pos = vec4(wpos, 1.0); + gl_ClipDistance[0] = dot(drw_view.clip_planes[0], pos); + gl_ClipDistance[1] = dot(drw_view.clip_planes[1], pos); + gl_ClipDistance[2] = dot(drw_view.clip_planes[2], pos); + gl_ClipDistance[3] = dot(drw_view.clip_planes[3], pos); + gl_ClipDistance[4] = dot(drw_view.clip_planes[4], pos); + gl_ClipDistance[5] = dot(drw_view.clip_planes[5], pos); +# endif +} + +/* Kept as define for compiler compatibility. */ +# ifdef USE_WORLD_CLIP_PLANES +# define view_clipping_distances_set(c) \ + gl_ClipDistance[0] = (c).gl_ClipDistance[0]; \ + gl_ClipDistance[1] = (c).gl_ClipDistance[1]; \ + gl_ClipDistance[2] = (c).gl_ClipDistance[2]; \ + gl_ClipDistance[3] = (c).gl_ClipDistance[3]; \ + gl_ClipDistance[4] = (c).gl_ClipDistance[4]; \ + gl_ClipDistance[5] = (c).gl_ClipDistance[5]; + +# else +# define view_clipping_distances_set(c) +# endif + +#endif diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index b0d405165f2..8627aa40bfd 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -84,66 +84,91 @@ vec4 pack_line_data(vec2 frag_co, vec2 edge_start, vec2 edge_pos) } } -uniform int resourceChunk; +/* Temporary until we fully make the switch. */ +#ifndef DRW_SHADER_SHARED_H +uniform int drw_resourceChunk; +#endif /* DRW_SHADER_SHARED_H */ #ifdef GPU_VERTEX_SHADER -# ifdef GPU_ARB_shader_draw_parameters -# define baseInstance gl_BaseInstanceARB -# else /* no ARB_shader_draw_parameters */ -uniform int baseInstance; -# endif -# if defined(IN_PLACE_INSTANCES) || defined(INSTANCED_ATTR) -/* When drawing instances of an object at the same position. */ -# define instanceId 0 -# elif defined(GPU_DEPRECATED_AMD_DRIVER) -/* A driver bug make it so that when using an attribute with GL_INT_2_10_10_10_REV as format, - * the gl_InstanceID is incremented by the 2 bit component of the attribute. - * Ignore gl_InstanceID then. */ -# define instanceId 0 -# else -# define instanceId gl_InstanceID -# endif +/* Temporary until we fully make the switch. */ +# ifndef DRW_SHADER_SHARED_H -# ifdef UNIFORM_RESOURCE_ID -/* This is in the case we want to do a special instance drawcall but still want to have the - * right resourceId and all the correct ubo datas. */ -uniform int resourceId; -# define resource_id resourceId -# else -# define resource_id (baseInstance + instanceId) -# endif +/* clang-format off */ +# if defined(IN_PLACE_INSTANCES) || defined(INSTANCED_ATTR) || defined(DRW_LEGACY_MODEL_MATRIX) || defined(GPU_DEPRECATED_AMD_DRIVER) +/* clang-format on */ +/* When drawing instances of an object at the same position. */ +# define instanceId 0 +# else +# define instanceId gl_InstanceID +# endif + +# if defined(UNIFORM_RESOURCE_ID) +/* This is in the case we want to do a special instance drawcall for one object but still want to + * have the right resourceId and all the correct ubo datas. */ +uniform int drw_resourceId; +# define resource_id drw_resourceId +# else +# define resource_id (gpu_BaseInstance + instanceId) +# endif /* Use this to declare and pass the value if * the fragment shader uses the resource_id. */ -# ifdef USE_GEOMETRY_SHADER -# define RESOURCE_ID_VARYING flat out int resourceIDGeom; -# define PASS_RESOURCE_ID resourceIDGeom = resource_id; -# else -# define RESOURCE_ID_VARYING flat out int resourceIDFrag; -# define PASS_RESOURCE_ID resourceIDFrag = resource_id; +# ifdef USE_GEOMETRY_SHADER +# define RESOURCE_ID_VARYING flat out int resourceIDGeom; +# define PASS_RESOURCE_ID resourceIDGeom = resource_id; +# else +# define RESOURCE_ID_VARYING flat out int resourceIDFrag; +# define PASS_RESOURCE_ID resourceIDFrag = resource_id; +# endif + +# endif /* DRW_SHADER_SHARED_H */ + +#endif /* GPU_VERTEX_SHADER */ + +/* Temporary until we fully make the switch. */ +#ifdef DRW_SHADER_SHARED_H +/* TODO(fclem): Rename PASS_RESOURCE_ID to DRW_RESOURCE_ID_VARYING_SET */ +# if defined(UNIFORM_RESOURCE_ID) +# define resource_id drw_ResourceID +# define PASS_RESOURCE_ID + +# elif defined(GPU_VERTEX_SHADER) +# define resource_id gpu_InstanceIndex +# define PASS_RESOURCE_ID drw_ResourceID_iface.resource_index = resource_id; + +# elif defined(GPU_GEOMETRY_SHADER) +# define resource_id drw_ResourceID_iface_in[0].index +# define PASS_RESOURCE_ID drw_ResourceID_iface_out.resource_index = resource_id; + +# elif defined(GPU_FRAGMENT_SHADER) +# define resource_id drw_ResourceID_iface.resource_index # endif -#endif +/* TODO(fclem): Remove. */ +# define RESOURCE_ID_VARYING + +#else /* If used in a fragment / geometry shader, we pass * resource_id as varying. */ -#ifdef GPU_GEOMETRY_SHADER -# define RESOURCE_ID_VARYING \ - flat out int resourceIDFrag; \ - flat in int resourceIDGeom[]; +# ifdef GPU_GEOMETRY_SHADER +# define RESOURCE_ID_VARYING \ + flat out int resourceIDFrag; \ + flat in int resourceIDGeom[]; -# define resource_id resourceIDGeom -# define PASS_RESOURCE_ID resourceIDFrag = resource_id[0]; -#endif +# define resource_id resourceIDGeom +# define PASS_RESOURCE_ID resourceIDFrag = resource_id[0]; +# endif -#ifdef GPU_FRAGMENT_SHADER +# ifdef GPU_FRAGMENT_SHADER flat in int resourceIDFrag; -# define resource_id resourceIDFrag +# define resource_id resourceIDFrag +# endif #endif /* Breaking this across multiple lines causes issues for some older GLSL compilers. */ /* clang-format off */ -#if !defined(GPU_INTEL) && !defined(GPU_DEPRECATED_AMD_DRIVER) && !defined(OS_MAC) && !defined(INSTANCED_ATTR) +#if !defined(GPU_INTEL) && !defined(GPU_DEPRECATED_AMD_DRIVER) && !defined(OS_MAC) && !defined(INSTANCED_ATTR) && !defined(DRW_LEGACY_MODEL_MATRIX) /* clang-format on */ /* Temporary until we fully make the switch. */ @@ -158,10 +183,10 @@ layout(std140) uniform modelBlock { ObjectMatrices drw_matrices[DRW_RESOURCE_CHUNK_LEN]; }; -# endif /* DRW_SHADER_SHARED_H */ -# define ModelMatrix (drw_matrices[resource_id].drw_modelMatrix) -# define ModelMatrixInverse (drw_matrices[resource_id].drw_modelMatrixInverse) +# define ModelMatrix (drw_matrices[resource_id].drw_modelMatrix) +# define ModelMatrixInverse (drw_matrices[resource_id].drw_modelMatrixInverse) +# endif /* DRW_SHADER_SHARED_H */ #else /* GPU_INTEL */ @@ -177,7 +202,10 @@ uniform mat4 ModelMatrixInverse; #endif -#define resource_handle (resourceChunk * DRW_RESOURCE_CHUNK_LEN + resource_id) +/* Temporary until we fully make the switch. */ +#ifndef DRW_SHADER_SHARED_H +# define resource_handle (drw_resourceChunk * DRW_RESOURCE_CHUNK_LEN + resource_id) +#endif /** Transform shortcuts. */ /* Rule of thumb: Try to reuse world positions and normals because converting through viewspace 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 10b3754eebb..17a32c7d5ed 100644 --- a/source/blender/draw/intern/shaders/draw_object_infos_info.hh +++ b/source/blender/draw/intern/shaders/draw_object_infos_info.hh @@ -2,4 +2,5 @@ #include "gpu_shader_create_info.hh" GPU_SHADER_CREATE_INFO(draw_object_infos) + .typedef_source("draw_shader_shared.h") .uniform_buf(1, "ObjectInfos", "drw_infos[DRW_RESOURCE_CHUNK_LEN]", Frequency::BATCH); diff --git a/source/blender/draw/intern/shaders/draw_view_info.hh b/source/blender/draw/intern/shaders/draw_view_info.hh index a92284efa5b..d40f51df543 100644 --- a/source/blender/draw/intern/shaders/draw_view_info.hh +++ b/source/blender/draw/intern/shaders/draw_view_info.hh @@ -2,6 +2,43 @@ #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"); + +/** + * 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_INTERFACE_INFO(draw_resource_id_iface, "drw_ResourceID_iface") + .flat(Type::INT, "resource_index"); + +GPU_SHADER_CREATE_INFO(draw_resource_id_varying) + .vertex_out(draw_resource_id_iface) + .geometry_out(draw_resource_id_iface); /* 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(64, Type::INT, "drw_ResourceID"); + +/** + * Declare a resource handle that identify a unique object. + * Requires draw_resource_id[_constant]. + */ +GPU_SHADER_CREATE_INFO(draw_resource_handle) + .define("resource_handle (drw_resourceChunk * DRW_RESOURCE_CHUNK_LEN + resource_id)") + .push_constant(63, Type::INT, "drw_resourceChunk"); + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Draw View * \{ */ @@ -9,7 +46,19 @@ GPU_SHADER_CREATE_INFO(draw_view) .uniform_buf(0, "ViewInfos", "drw_view", Frequency::PASS) .typedef_source("draw_shader_shared.h"); -GPU_SHADER_CREATE_INFO(draw_view_instanced_attr) +GPU_SHADER_CREATE_INFO(draw_modelmat) + .uniform_buf(8, "ObjectMatrices", "drw_matrices[DRW_RESOURCE_CHUNK_LEN]", Frequency::BATCH) + .define("ModelMatrix", "(drw_matrices[resource_id].drw_modelMatrix)") + .define("ModelMatrixInverse", "(drw_matrices[resource_id].drw_modelMatrixInverse)") + .additional_info("draw_view"); + +GPU_SHADER_CREATE_INFO(draw_modelmat_legacy) + .define("DRW_LEGACY_MODEL_MATRIX") + .push_constant(38, Type::MAT4, "ModelMatrix") + .push_constant(54, Type::MAT4, "ModelMatrixInverse") + .additional_info("draw_view"); + +GPU_SHADER_CREATE_INFO(draw_modelmat_instanced_attr) .push_constant(0, Type::MAT4, "ModelMatrix") .push_constant(16, Type::MAT4, "ModelMatrixInverse") .additional_info("draw_view"); @@ -17,24 +66,40 @@ GPU_SHADER_CREATE_INFO(draw_view_instanced_attr) /** \} */ /* -------------------------------------------------------------------- */ +/** \name Draw View + * \{ */ + +GPU_SHADER_CREATE_INFO(drw_clipped).define("USE_WORLD_CLIP_PLANES"); + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Geometry Type * \{ */ -GPU_SHADER_CREATE_INFO(draw_mesh) - .uniform_buf(8, "ObjectMatrices", "drw_matrices[DRW_RESOURCE_CHUNK_LEN]", Frequency::BATCH) - .additional_info("draw_view"); +GPU_SHADER_CREATE_INFO(draw_mesh).additional_info("draw_modelmat", "draw_resource_id"); GPU_SHADER_CREATE_INFO(draw_hair) - /* TODO(fclem) Finish */ - .uniform_buf(8, "ObjectMatrices", "drw_matrices[DRW_RESOURCE_CHUNK_LEN]", Frequency::BATCH) - .additional_info("draw_view"); + .sampler(15, ImageType::FLOAT_BUFFER, "hairPointBuffer") + .sampler(14, ImageType::UINT_BUFFER, "hairStrandBuffer") + .sampler(13, ImageType::UINT_BUFFER, "hairStrandSegBuffer") + /* TODO(fclem) Pack thoses into one UBO. */ + .push_constant(9, Type::INT, "hairStrandsRes") + .push_constant(10, Type::INT, "hairThicknessRes") + .push_constant(11, Type::FLOAT, "hairRadRoot") + .push_constant(12, Type::FLOAT, "hairRadTip") + .push_constant(13, Type::FLOAT, "hairRadShape") + .push_constant(14, Type::BOOL, "hairCloseTip") + .push_constant(15, Type::INT, "hairStrandOffset") + .push_constant(16, Type::VEC4, "hairDupliMatrix", 4) + .additional_info("draw_modelmat", "draw_resource_id"); GPU_SHADER_CREATE_INFO(draw_pointcloud) .vertex_in(0, Type::VEC4, "pos") .vertex_in(1, Type::VEC3, "pos_inst") .vertex_in(2, Type::VEC3, "nor") - .define("UNIFORM_RESOURCE_ID") - .define("INSTANCED_ATTR") - .additional_info("draw_view_instanced_attr"); + .additional_info("draw_modelmat_instanced_attr", "draw_resource_id_uniform"); + +GPU_SHADER_CREATE_INFO(draw_volume).additional_info("draw_modelmat", "draw_resource_id_uniform"); /** \} */ |