WIP: Draw: Sub Handles #105175

Closed
Miguel Pozo wants to merge 5 commits from pragma37/blender:pull-thin-handles-2 into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
3 changed files with 31 additions and 24 deletions
Showing only changes of commit 1ffcd99736 - Show all commits

View File

@ -26,24 +26,28 @@ struct DupliObject;
namespace blender::draw {
struct ResourceHandle {
uint raw;
union {
uint raw;
struct {
uint index : 25;
uint sub_index : 6;
uint inverted_handedness : 1;
};
};
ResourceHandle() = default;
ResourceHandle(uint raw_) : raw(raw_){};
ResourceHandle(uint index, bool inverted_handedness)
{
raw = index;
SET_FLAG_FROM_TEST(raw, inverted_handedness, 0x80000000u);
}
: index(index), sub_index(0), inverted_handedness(inverted_handedness){};
bool has_inverted_handedness() const
{
return (raw & 0x80000000u) != 0;
return inverted_handedness != 0;
}
uint resource_index() const
{
return (raw & 0x7FFFFFFFu);
return index;
}
};

View File

@ -88,22 +88,22 @@ uniform int drw_resourceChunk;
/* 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
# define _resource_id_ drw_ResourceID
# else
# define resource_id (gpu_BaseInstance + instanceId)
# define _resource_id_ (gpu_BaseInstance + instanceId)
# endif
/* Use this to declare and pass the value if
* the fragment shader uses the resource_id. */
# if defined(EEVEE_GENERATED_INTERFACE)
# define RESOURCE_ID_VARYING
# define PASS_RESOURCE_ID resourceIDFrag = resource_id;
# define PASS_RESOURCE_ID resourceIDFrag = _resource_id_;
# elif defined(USE_GEOMETRY_SHADER)
# define RESOURCE_ID_VARYING flat out int resourceIDGeom;
# define PASS_RESOURCE_ID resourceIDGeom = resource_id;
# define PASS_RESOURCE_ID resourceIDGeom = _resource_id_;
# else
# define RESOURCE_ID_VARYING flat out int resourceIDFrag;
# define PASS_RESOURCE_ID resourceIDFrag = resource_id;
# define PASS_RESOURCE_ID resourceIDFrag = _resource_id_;
# endif
# endif /* USE_GPU_SHADER_CREATE_INFO */
@ -114,23 +114,23 @@ uniform int drw_ResourceID;
#ifdef USE_GPU_SHADER_CREATE_INFO
/* TODO(fclem): Rename PASS_RESOURCE_ID to DRW_RESOURCE_ID_VARYING_SET */
# if defined(UNIFORM_RESOURCE_ID)
# define resource_id drw_ResourceID
# define _resource_id_ drw_ResourceID
# define PASS_RESOURCE_ID
# elif defined(GPU_VERTEX_SHADER)
# if defined(UNIFORM_RESOURCE_ID_NEW)
# define resource_id (drw_ResourceID >> DRW_VIEW_SHIFT)
# define _resource_id_ (drw_ResourceID >> DRW_VIEW_SHIFT)
# else
# define resource_id gpu_InstanceIndex
# define _resource_id_ gpu_InstanceIndex
# endif
# define PASS_RESOURCE_ID drw_ResourceID_iface.resource_index = resource_id;
# define PASS_RESOURCE_ID drw_ResourceID_iface.resource_index = _resource_id_;
# elif defined(GPU_GEOMETRY_SHADER)
# define resource_id drw_ResourceID_iface_in[0].resource_index
# define PASS_RESOURCE_ID drw_ResourceID_iface_out.resource_index = resource_id;
# define _resource_id_ drw_ResourceID_iface_in[0].resource_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
# define _resource_id_ drw_ResourceID_iface.resource_index
# endif
/* TODO(fclem): Remove. */
@ -149,18 +149,21 @@ uniform int drw_ResourceID;
# define RESOURCE_ID_VARYING
# endif
# define resource_id resourceIDGeom
# define PASS_RESOURCE_ID resourceIDFrag = resource_id[0];
# define _resource_id_ resourceIDGeom
# define PASS_RESOURCE_ID resourceIDFrag = _resource_id_[0];
# endif
# if defined(GPU_FRAGMENT_SHADER)
# if !defined(EEVEE_GENERATED_INTERFACE)
flat in int resourceIDFrag;
# endif
# define resource_id resourceIDFrag
# define _resource_id_ resourceIDFrag
# endif
#endif
#define resource_id int(_resource_id_ & 0x01ffffffu)
#define sub_resource_id int((_resource_id_ >> 25) & 0x3fu)
/* 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(GPU_METAL)) && !defined(INSTANCED_ATTR) && !defined(DRW_LEGACY_MODEL_MATRIX)

View File

@ -53,7 +53,7 @@ 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);
uint resource_index = (proto.resource_handle & 0x01ffffffu);
/* Visibility test result. */
uint visible_instance_len = 0;
@ -117,7 +117,7 @@ void main()
}
else {
for (uint i = dst_index; i < dst_index + visible_instance_len; i++) {
resource_id_buf[i] = resource_index;
resource_id_buf[i] = proto.resource_handle & 0x07ffffffu;
}
}
}