WIP: Draw: Sub Handles #105175
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue