113 if (location == -1) {
167 state.front_facing_set(handle.has_inverted_handedness());
205 while (group_index !=
uint(-1)) {
206 const DrawGroup &group = groups[group_index];
208 if (group.vertex_len > 0) {
225 intptr_t offset = stride * group_index * 2;
228 if (group.len - group.front_facing_len > 0) {
229 state.front_facing_set(
true);
233 if (group.front_facing_len > 0) {
234 state.front_facing_set(
false);
239 group_index = group.next;
245 state.front_facing_set(handle.has_inverted_handedness());
293 if (!state_changed && !clip_changed) {
358 return std::string(
".framebuffer_bind(") +
370 return std::string(
".subpass_transition(\n") +
386 return std::string(
".bind_texture") + (
is_reference ?
"_ref" :
"") +
"(" +
389 return std::string(
".bind_vertbuf_as_texture") + (
is_reference ?
"_ref" :
"") +
"(" +
390 std::to_string(
slot) +
")";
392 return std::string(
".bind_image") + (
is_reference ?
"_ref" :
"") +
"(" +
393 std::to_string(
slot) +
")";
395 return std::string(
".bind_uniform_buf") + (
is_reference ?
"_ref" :
"") +
"(" +
396 std::to_string(
slot) +
")";
398 return std::string(
".bind_storage_buf") + (
is_reference ?
"_ref" :
"") +
"(" +
399 std::to_string(
slot) +
")";
401 return std::string(
".bind_uniform_as_ssbo") + (
is_reference ?
"_ref" :
"") +
"(" +
402 std::to_string(
slot) +
")";
404 return std::string(
".bind_vertbuf_as_ssbo") + (
is_reference ?
"_ref" :
"") +
"(" +
405 std::to_string(
slot) +
")";
407 return std::string(
".bind_indexbuf_as_ssbo") + (
is_reference ?
"_ref" :
"") +
"(" +
408 std::to_string(
slot) +
")";
417 std::stringstream ss;
505 return std::string(
".push_constant(") + std::to_string(location) +
", data=" + ss.str() +
")";
510 std::stringstream ss;
537 return std::string(
".specialize_constant(") + std::to_string(location) +
", data=" + ss.str() +
547 return std::string(
".draw(inst_len=") + inst_len +
", vert_len=" + vert_len +
548 ", vert_first=" + vert_first +
", res_id=" + std::to_string(handle.resource_index()) +
562 return (a.group_id < b.group_id) ||
563 (a.group_id == b.group_id && a.resource_handle > b.resource_handle);
567 uint prefix_sum = 0u;
569 group.start = prefix_sum;
570 prefix_sum += group.front_facing_counter + group.back_facing_counter;
573 std::stringstream ss;
577 while (group_index !=
uint(-1)) {
578 const DrawGroup &grp = groups[group_index];
580 ss << std::endl << line_prefix <<
" .group(id=" << group_index <<
", len=" << grp.
len <<
")";
590 << line_prefix <<
" .proto(instance_len=" << std::to_string(proto.instance_len)
591 <<
", resource_id=" << std::to_string(handle.resource_index()) <<
", back_face)";
600 BLI_assert(!handle.has_inverted_handedness());
602 << line_prefix <<
" .proto(instance_len=" << std::to_string(proto.instance_len)
603 <<
", resource_id=" << std::to_string(handle.resource_index()) <<
", front_face)";
607 group_index = grp.
next;
613 return line_prefix +
".draw_multi(" + std::to_string(group_len) +
")" + ss.str();
618 return std::string(
".draw_indirect()");
624 return std::string(
".dispatch") + (
is_reference ?
"_ref" :
"") +
"(" + std::to_string(sz.x) +
625 ", " + std::to_string(sz.y) +
", " + std::to_string(sz.z) +
")";
630 return std::string(
".dispatch_indirect()");
636 return std::string(
".barrier(") + std::to_string(type) +
")";
641 std::stringstream ss;
643 ss <<
"color=" <<
color;
649 ss <<
"depth=" <<
depth;
655 ss <<
"stencil=0b" << std::bitset<8>(
stencil) <<
")";
657 return std::string(
".clear(") + ss.str() +
")";
662 std::stringstream ss;
666 return std::string(
".clear_multi(colors={") + ss.str() +
"})";
672 return std::string(
".state_set(") + std::to_string(
new_state) +
")";
677 std::stringstream ss;
678 ss <<
".stencil_set(write_mask=0b" << std::bitset<8>(
write_mask) <<
", reference=0b"
679 << std::bitset<8>(reference) <<
", compare_mask=0b" << std::bitset<8>(
compare_mask) <<
")";
691 SubPassVector &sub_passes,
692 uint &resource_id_count,
693 ResourceIdBuf &resource_id_buf)
695 for (
const Header &header : headers) {
698 auto &sub = sub_passes[
int64_t(header.index)];
700 sub.headers_, sub.commands_, sub_passes, resource_id_count, resource_id_buf);
707 Draw &cmd = commands[header.index].draw;
709 int batch_vert_len, batch_vert_first, batch_base_index, batch_inst_len;
712 cmd.batch, &batch_vert_len, &batch_vert_first, &batch_base_index, &batch_inst_len);
717 if (cmd.vertex_len ==
uint(-1)) {
718 cmd.vertex_len = batch_vert_len;
721#ifdef WITH_METAL_BACKEND
725 cmd.batch->prim_type);
726 cmd.vertex_len = num_input_primitives *
731 if (cmd.handle.raw > 0) {
733 uint instance_first = resource_id_count;
734 resource_id_count += cmd.instance_len;
736 resource_id_buf.get_or_resize(resource_id_count - 1);
739 uint index = cmd.handle.resource_index();
740 for (
int i = instance_first; i < (instance_first + cmd.instance_len); i++) {
741 resource_id_buf[i] = index;
752 resource_id_count_ = 0;
754 finalize_commands(headers, commands, sub_passes, resource_id_count_, resource_id_buf_);
759 state.resource_id_buf = resource_id_buf_;
770 int visibility_word_per_draw,
776 resource_id_count_ = 0u;
779 group.start = resource_id_count_;
780 resource_id_count_ += group.len;
782 int batch_vert_len, batch_vert_first, batch_base_index, batch_inst_len;
790 group.vertex_len = group.desc.vertex_len == 0 ? batch_vert_len : group.desc.vertex_len;
791 group.vertex_first = group.desc.vertex_first == -1 ? batch_vert_first :
792 group.desc.vertex_first;
793 group.base_index = batch_base_index;
802 group.desc.gpu_batch,
807 group.vertex_first = vert_range.
start() * group.desc.expand_prim_len;
808 group.vertex_len = vert_range.
size() * group.desc.expand_prim_len;
811 group.base_index = -1;
814#ifdef WITH_METAL_BACKEND
816 if (group.desc.gpu_shader) {
818 group.desc.gpu_batch->prim_type);
819 group.vertex_len = num_input_primitives *
821 group.desc.gpu_shader);
825 group.base_index = -1;
830 group.total_counter = group.front_facing_counter = group.back_facing_counter = 0;
836 resource_id_buf_.
get_or_resize(resource_id_count_ * view_len * (use_custom_ids ? 2 : 1));
840 if (prototype_count_ > 0) {
856 state.resource_id_buf = resource_id_buf_;
#define BLI_assert_unreachable()
MINLINE unsigned int log2_ceil_u(unsigned int x)
MINLINE uint divide_ceil_u(uint a, uint b)
#define UNUSED_VARS_NDEBUG(...)
void GPU_batch_draw_advanced(blender::gpu::Batch *batch, int vertex_first, int vertex_count, int instance_first, int instance_count)
void GPU_batch_draw_indirect(blender::gpu::Batch *batch, GPUStorageBuf *indirect_buf, intptr_t offset)
void GPU_batch_resource_id_buf_set(blender::gpu::Batch *batch, GPUStorageBuf *resource_id_buf)
blender::IndexRange GPU_batch_draw_expanded_parameter_get(const blender::gpu::Batch *batch, GPUPrimType expanded_prim_type, int vertex_count, int vertex_first)
void GPU_batch_set_shader(blender::gpu::Batch *batch, GPUShader *shader)
void GPU_batch_draw_parameter_get(blender::gpu::Batch *batch, int *r_vertex_count, int *r_vertex_first, int *r_base_index, int *r_instance_count)
void GPU_batch_bind_as_resources(blender::gpu::Batch *batch, GPUShader *shader)
bool GPU_shader_draw_parameters_support()
void GPU_compute_dispatch(GPUShader *shader, uint groups_x_len, uint groups_y_len, uint groups_z_len)
void GPU_debug_group_end()
void GPU_debug_group_begin(const char *name)
const char * GPU_framebuffer_get_name(GPUFrameBuffer *framebuffer)
GPUFrameBuffer * GPU_framebuffer_active_get()
void GPU_framebuffer_clear(GPUFrameBuffer *framebuffer, eGPUFrameBufferBits buffers, const float clear_col[4], float clear_depth, unsigned int clear_stencil)
void GPU_framebuffer_multi_clear(GPUFrameBuffer *framebuffer, const float(*clear_colors)[4])
void GPU_framebuffer_bind(GPUFrameBuffer *framebuffer)
void GPU_framebuffer_subpass_transition_array(GPUFrameBuffer *framebuffer, const GPUAttachmentState *attachment_states, uint attachment_len)
void GPU_indexbuf_bind_as_ssbo(blender::gpu::IndexBuf *elem, int binding)
int gpu_get_prim_count_from_type(uint vertex_len, GPUPrimType prim_type)
const char * GPU_shader_get_name(GPUShader *shader)
void GPU_shader_uniform_1i(GPUShader *sh, const char *name, int value)
void GPU_shader_uniform_int_ex(GPUShader *shader, int location, int length, int array_size, const int *value)
int GPU_shader_get_ssbo_vertex_fetch_num_verts_per_prim(GPUShader *shader)
int GPU_shader_get_ssbo_binding(GPUShader *shader, const char *name)
void GPU_shader_constant_bool_ex(GPUShader *sh, int location, bool value)
void GPU_shader_constant_int_ex(GPUShader *sh, int location, int value)
void GPU_shader_uniform_float_ex(GPUShader *shader, int location, int length, int array_size, const float *value)
void GPU_shader_bind(GPUShader *shader)
void GPU_shader_constant_float_ex(GPUShader *sh, int location, float value)
void GPU_shader_uniform_1b(GPUShader *sh, const char *name, bool value)
void GPU_shader_constant_uint_ex(GPUShader *sh, int location, unsigned int value)
void GPU_memory_barrier(eGPUBarrier barrier)
void GPU_program_point_size(bool enable)
void GPU_stencil_write_mask_set(uint write_mask)
void GPU_depth_range(float near, float far)
void GPU_stencil_reference_set(uint reference)
@ GPU_BARRIER_SHADER_STORAGE
@ GPU_BARRIER_VERTEX_ATTRIB_ARRAY
void GPU_stencil_compare_mask_set(uint compare_mask)
void GPU_state_set(eGPUWriteMask write_mask, eGPUBlend blend, eGPUFaceCullTest culling_test, eGPUDepthTest depth_test, eGPUStencilTest stencil_test, eGPUStencilOp stencil_op, eGPUProvokingVertex provoking_vert)
void GPU_clip_distances(int distances_enabled)
void GPU_shadow_offset(bool enable)
void GPU_storagebuf_bind(GPUStorageBuf *ssbo, int slot)
void GPU_storagebuf_sync_as_indirect_buffer(GPUStorageBuf *ssbo)
void GPU_texture_bind_ex(GPUTexture *texture, GPUSamplerState state, int unit)
void GPU_texture_image_bind(GPUTexture *texture, int unit)
void GPU_vertbuf_bind_as_ssbo(blender::gpu::VertBuf *verts, int binding)
void GPU_vertbuf_bind_as_texture(blender::gpu::VertBuf *verts, int binding)
struct GPUShader GPUShader
constexpr int64_t size() const
constexpr bool is_empty() const
constexpr int64_t start() const
constexpr MutableSpan slice_safe(const int64_t start, const int64_t size) const
constexpr T * end() const
constexpr T * begin() const
T & get_or_resize(int64_t index)
void bind(RecordingState &state, Vector< Header, 0 > &headers, Vector< Undetermined, 0 > &commands, SubPassVector &sub_passes)
void bind(RecordingState &state, Vector< Header, 0 > &headers, Vector< Undetermined, 0 > &commands, VisibilityBuf &visibility_buf, int visibility_word_per_draw, int view_len, bool use_custom_ids)
local_group_size(16, 16) .push_constant(Type b
blender::gpu::Batch * drw_cache_procedural_lines_get()
blender::gpu::Batch * drw_cache_procedural_triangles_get()
blender::gpu::Batch * drw_cache_procedural_triangle_strips_get()
blender::gpu::Batch * drw_cache_procedural_points_get()
#define DRW_RESOURCE_ID_SLOT
#define DRW_COMMAND_GROUP_SIZE
GPUShader * DRW_shader_draw_command_generate_get()
@ DRW_STATE_IN_FRONT_SELECT
@ DRW_STATE_PROGRAM_POINT_SIZE
@ DRW_STATE_SHADOW_OFFSET
DOF_REDUCE_GROUP_SIZE dof_buf scatter_fg_list_buf[] DrawCommand
void GPU_compute_dispatch_indirect(GPUShader *shader, GPUStorageBuf *indirect_buf_)
BLI_INLINE float fb(float length, float L)
static gpu::Batch * procedural_batch_get(GPUPrimType primitive)
static eGPUDepthTest to_depth_test(DRWState state)
static eGPUBlend to_blend(DRWState state)
static eGPUProvokingVertex to_provoking_vertex(DRWState state)
static eGPUStencilOp to_stencil_op(DRWState state)
static eGPUStencilTest to_stencil_test(DRWState state)
static eGPUWriteMask to_write_mask(DRWState state)
static eGPUFaceCullTest to_face_cull_test(DRWState state)
bool assign_if_different(T &old_value, T new_value)
MatBase< float, 4, 4 > float4x4
std::string to_string() const
std::string serialize() const
std::string serialize() const
std::string serialize() const
GPUStorageBuf ** indirect_buf
std::string serialize() const
void execute(RecordingState &state) const
std::string serialize() const
void execute(RecordingState &state) const
uint front_facing_counter
struct blender::draw::command::DrawGroup::@274 desc
void execute(RecordingState &state) const
std::string serialize() const
GPUStorageBuf ** indirect_buf
std::string serialize(const std::string &line_prefix) const
DrawMultiBuf * multi_draw_buf
void execute(RecordingState &state) const
bool is_primitive_expansion() const
void execute(RecordingState &state) const
std::string serialize() const
GPUFrameBuffer ** framebuffer
std::string serialize() const
void execute(RecordingState &state) const
const float4 * float4_ref
std::string serialize() const
const float3 * float3_ref
const float2 * float2_ref
const float4x4 * float4x4_ref
GPUStorageBuf ** storage_buf_ref
gpu::VertBuf * vertex_buf
GPUUniformBuf ** uniform_buf_ref
GPUStorageBuf * storage_buf
gpu::VertBuf ** vertex_buf_ref
GPUUniformBuf * uniform_buf
gpu::IndexBuf * index_buf
std::string serialize() const
gpu::IndexBuf ** index_buf_ref
GPUTexture ** texture_ref
void execute(RecordingState &state) const
std::string serialize() const
std::string serialize() const
std::string serialize() const
void execute(RecordingState &state) const
std::string serialize() const
std::string serialize() const