67using namespace blender::draw;
68using namespace blender::draw::command;
101 if (blocks_.is_empty() || blocks_.last()->size() == block_size) {
104 return blocks_.last()->append_and_get_index(std::move(elem)) +
105 (blocks_.size() - 1) * block_size;
110 return (*blocks_[index / block_size])[index % block_size];
115 return (*blocks_[index / block_size])[index % block_size];
124 typename DrawCommandBufType>
127 friend DrawCommandBuf;
155 DrawCommandBufType &draw_command_buf,
157 GPUShader *shader =
nullptr)
219 void state_stencil(uint8_t write_mask, uint8_t reference, uint8_t compare_mask);
248 bool deferred_texture_loading =
false);
256 uint instance_len = -1,
257 uint vertex_len = -1,
258 uint vertex_first = -1,
275 uint vertex_first = -1,
296 uint vertex_len = -1,
297 uint vertex_first = -1,
320 StorageBuffer<DrawCommand, true> &indirect_buffer,
321 ResourceHandle handle = {0});
330 void dispatch(StorageBuffer<DispatchCommand> &indirect_buffer);
349 void bind_image(
const char *name, GPUTexture *image);
350 void bind_image(
const char *name, GPUTexture **image);
352 void bind_image(
int slot, GPUTexture **image);
355 void bind_texture(
const char *name, gpu::VertBuf *buffer);
356 void bind_texture(
const char *name, gpu::VertBuf **buffer);
361 void bind_ssbo(
const char *name, GPUStorageBuf *buffer);
362 void bind_ssbo(
const char *name, GPUStorageBuf **buffer);
363 void bind_ssbo(
int slot, GPUStorageBuf *buffer);
364 void bind_ssbo(
int slot, GPUStorageBuf **buffer);
365 void bind_ssbo(
const char *name, GPUUniformBuf *buffer);
366 void bind_ssbo(
const char *name, GPUUniformBuf **buffer);
367 void bind_ssbo(
int slot, GPUUniformBuf *buffer);
368 void bind_ssbo(
int slot, GPUUniformBuf **buffer);
369 void bind_ssbo(
const char *name, gpu::VertBuf *buffer);
370 void bind_ssbo(
const char *name, gpu::VertBuf **buffer);
371 void bind_ssbo(
int slot, gpu::VertBuf *buffer);
372 void bind_ssbo(
int slot, gpu::VertBuf **buffer);
373 void bind_ssbo(
const char *name, gpu::IndexBuf *buffer);
374 void bind_ssbo(
const char *name, gpu::IndexBuf **buffer);
375 void bind_ssbo(
int slot, gpu::IndexBuf *buffer);
376 void bind_ssbo(
int slot, gpu::IndexBuf **buffer);
377 void bind_ubo(
const char *name, GPUUniformBuf *buffer);
378 void bind_ubo(
const char *name, GPUUniformBuf **buffer);
379 void bind_ubo(
int slot, GPUUniformBuf *buffer);
380 void bind_ubo(
int slot, GPUUniformBuf **buffer);
442 resources.bind_resources(*
this);
448 std::string
serialize(std::string line_prefix =
"")
const;
496 DrawCommandBufType draw_commands_buf_main_;
500 :
detail::
PassBase<DrawCommandBufType>(name, draw_commands_buf_main_, sub_passes_main_){};
504 this->manager_fingerprint_ = 0;
505 this->view_fingerprint_ = 0;
506 this->headers_.
clear();
507 this->commands_.
clear();
508 this->sub_passes_.
clear();
509 this->draw_commands_buf_.clear();
510 this->is_empty_ =
true;
547 bool sorted_ =
false;
554 sorting_values_.clear();
571 sorting_index = sorting_values_.append_and_get_index(sorting_value);
572 }
while (sorting_index != index);
576 std::string
serialize(std::string line_prefix =
"")
const
578 if (sorted_ ==
false) {
587 if (sorted_ ==
false) {
589 BLI_assert(a.type == Type::SubPass && b.type == Type::SubPass);
590 float a_val = sorting_values_[a.index];
591 float b_val = sorting_values_[b.index];
592 return a_val < b_val || (a_val == b_val && a.index < b.index);
660 static_cast<int>(colors.
size())};
696 switch (header.type) {
753 switch (header.type) {
761 commands_[header.index].framebuffer_bind.execute();
764 commands_[header.index].subpass_transition.execute();
770 commands_[header.index].resource_bind.execute();
794 commands_[header.index].barrier.execute();
800 commands_[header.index].clear_multi.execute();
806 commands_[header.index].stencil_set.execute();
816 std::stringstream ss;
817 ss << line_prefix <<
"." <<
debug_name << std::endl;
820 switch (header.type) {
825 ss <<
sub_passes_[header.index].serialize(line_prefix);
828 ss << line_prefix <<
commands_[header.index].framebuffer_bind.serialize() << std::endl;
831 ss << line_prefix <<
commands_[header.index].subpass_transition.serialize() << std::endl;
834 ss << line_prefix <<
commands_[header.index].shader_bind.serialize() << std::endl;
837 ss << line_prefix <<
commands_[header.index].resource_bind.serialize() << std::endl;
840 ss << line_prefix <<
commands_[header.index].push_constant.serialize() << std::endl;
843 ss << line_prefix <<
commands_[header.index].draw.serialize() << std::endl;
846 ss <<
commands_[header.index].draw_multi.serialize(line_prefix);
849 ss << line_prefix <<
commands_[header.index].draw_indirect.serialize() << std::endl;
852 ss << line_prefix <<
commands_[header.index].dispatch.serialize() << std::endl;
855 ss << line_prefix <<
commands_[header.index].dispatch_indirect.serialize() << std::endl;
858 ss << line_prefix <<
commands_[header.index].barrier.serialize() << std::endl;
861 ss << line_prefix <<
commands_[header.index].clear.serialize() << std::endl;
864 ss << line_prefix <<
commands_[header.index].clear_multi.serialize() << std::endl;
867 ss << line_prefix <<
commands_[header.index].state_set.serialize() << std::endl;
870 ss << line_prefix <<
commands_[header.index].stencil_set.serialize() << std::endl;
891 if (instance_len == 0 || vertex_len == 0) {
911 this->
draw(
batch, -1, -1, -1, handle, custom_id);
924 if (instance_len == 0 || vertex_len == 0 || primitive_len == 0) {
949 this->
draw_expand(
batch, primitive_type, primitive_len, instance_len, -1, -1, handle, custom_id);
1077 if (clip_plane_count > 0) {
1108 color_states[
i] = uint8_t(color_attachments[
i]);
1124 bool deferred_texture_loading)
1134 const bool use_tile_mapping = tex->tiled_mapping_name[0];
1135 ImageUser *iuser = tex->iuser_available ? &tex->iuser :
nullptr;
1138 if (deferred_texture_loading) {
1145 if (*gputex.
texture ==
nullptr) {
1163 else if (tex->colorband) {
1167 else if (tex->sky) {
1169 bind_texture(tex->sampler_name, *tex->sky, tex->sampler_state);
1174 if (ubo !=
nullptr) {
1526 const char *constant_name,
1527 const int &constant_value)
1535 const char *constant_name,
1536 const uint &constant_value)
1544 const char *constant_name,
1545 const float &constant_value)
1553 const char *constant_name,
1554 const bool &constant_value)
1562 const char *constant_name,
1563 const int *constant_value)
1571 const char *constant_name,
1572 const uint *constant_value)
1580 const char *constant_name,
1581 const float *constant_value)
1589 const char *constant_name,
1590 const bool *constant_value)
ImageGPUTextures BKE_image_get_gpu_material_texture_try(Image *image, ImageUser *iuser, const bool use_tile_mapping)
ImageGPUTextures BKE_image_get_gpu_material_texture(Image *image, ImageUser *iuser, const bool use_tile_mapping)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
blender::gpu::Batch * GPU_batch_procedural_triangle_strips_get()
blender::gpu::Batch * GPU_batch_procedural_lines_get()
blender::gpu::Batch * GPU_batch_procedural_points_get()
blender::gpu::Batch * GPU_batch_procedural_triangles_get()
void GPU_debug_group_end()
void GPU_debug_group_begin(const char *name)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
ListBase GPU_material_textures(GPUMaterial *material)
GPUUniformBuf * GPU_material_uniform_buffer_get(GPUMaterial *material)
GPUShader * GPU_pass_shader_get(GPUPass *pass)
int GPU_shader_get_sampler_binding(GPUShader *shader, const char *name)
int GPU_shader_get_uniform(GPUShader *shader, const char *name)
int GPU_shader_get_ubo_binding(GPUShader *shader, const char *name)
int GPU_shader_get_ssbo_binding(GPUShader *shader, const char *name)
int GPU_shader_get_constant(GPUShader *shader, const char *name)
BMesh const char void * data
unsigned long long int uint64_t
constexpr const T * data() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
void acquire_texture(GPUTexture *texture)
std::string serialize(std::string line_prefix="") const
PassSortable(const char *name_)
PassMain::Sub & sub(const char *name, float sorting_value)
void clear_multi(Span< float4 > colors)
void bind_texture(const char *name, GPUTexture *texture, GPUSamplerState state=sampler_auto)
void bind_resources(U &resources)
void draw_procedural_indirect(GPUPrimType primitive, StorageBuffer< DrawCommand, true > &indirect_buffer, ResourceHandle handle={0})
void bind_image(const char *name, GPUTexture *image)
friend std::ostream & operator<<(std::ostream &stream, const PassBase &pass)
void clear_depth(float depth)
Vector< command::Header, 0 > headers_
uint64_t view_fingerprint_
uint64_t manager_fingerprint_
bool has_generated_commands() const
void specialize_constant(GPUShader *shader, const char *name, const float &data)
void clear_stencil(uint8_t stencil)
void clear_color(float4 color)
void warm_shader_specialization(command::RecordingState &state) const
void draw(gpu::Batch *batch, uint instance_len=-1, uint vertex_len=-1, uint vertex_first=-1, ResourceHandleRange handle={0}, uint custom_id=0)
void subpass_transition(GPUAttachmentState depth_attachment, Span< GPUAttachmentState > color_attachments)
void clear_depth_stencil(float depth, uint8_t stencil)
SubPassVector< PassBase< DrawCommandBufType > > & sub_passes_
PassBase(const char *name, DrawCommandBufType &draw_command_buf, SubPassVector< PassBase< DrawCommandBufType > > &sub_passes, GPUShader *shader=nullptr)
command::Undetermined & create_command(command::Type type)
PassBase< DrawCommandBufType > & sub(const char *name)
void dispatch(int group_len)
int push_constant_offset(const char *name)
void submit(command::RecordingState &state) const
void barrier(eGPUBarrier type)
void state_set(DRWState state, int clip_plane_count=0)
void draw_indirect(gpu::Batch *batch, StorageBuffer< DrawCommand, true > &indirect_buffer, ResourceHandle handle={0})
void draw_expand(gpu::Batch *batch, GPUPrimType primitive_type, uint primitive_len, uint instance_len, uint vertex_len=-1, uint vertex_first=-1, ResourceHandleRange handle={0}, uint custom_id=0)
void bind_ubo(const char *name, GPUUniformBuf *buffer)
void clear(eGPUFrameBufferBits planes, float4 color, float depth, uint8_t stencil)
void framebuffer_set(GPUFrameBuffer **framebuffer)
Vector< command::Undetermined, 0 > commands_
void state_stencil(uint8_t write_mask, uint8_t reference, uint8_t compare_mask)
void clear_color_depth_stencil(float4 color, float depth, uint8_t stencil)
void material_set(Manager &manager, GPUMaterial *material, bool deferred_texture_loading=false)
std::string serialize(std::string line_prefix="") const
void push_constant(const char *name, const float &data)
void draw_procedural(GPUPrimType primitive, uint instance_len, uint vertex_len, uint vertex_first=-1, ResourceHandleRange handle={0}, uint custom_id=0)
gpu::Batch * procedural_batch_get(GPUPrimType primitive)
DrawCommandBufType & draw_commands_buf_
void bind_ssbo(const char *name, GPUStorageBuf *buffer)
void shader_set(GPUShader *shader)
detail::PassBase< command::DrawCommandBuf > Sub
T & operator[](int64_t index)
const T & operator[](int64_t index) const
int64_t append_and_get_index(T &&elem)
@ DRW_STATE_PROGRAM_POINT_SIZE
struct @064345207361167251075330302113175271221317160336::@113254110077376341056327177062323111323010325277 batch
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
static void clear(Message &msg)
static Image * as_image(GPUTexture *tex)
detail::Pass< command::DrawMultiBuf > PassMain
VecBase< int32_t, 4 > int4
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< int32_t, 3 > int3
ListBaseWrapperTemplate< ListBase, T > ListBaseWrapper
VecBase< float, 3 > float3
static constexpr GPUSamplerState internal_sampler()
GPUTexture ** tile_mapping
enum blender::draw::command::PushConstant::Type type
PushConstant push_constant