X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fdraw%2Fdraw_llvm.h;h=c75179cb957cdf91878cbbceaa5fd55a5c7a991b;hb=8a4ef09e7e02b155de658f09df948dd6244e0b8d;hp=914f783fd000209b9715a103528ce9548d9d0ec1;hpb=dc2357070cb78497686d5d3b02418032dddac5ac;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h index 914f783fd00..c75179cb957 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.h +++ b/src/gallium/auxiliary/draw/draw_llvm.h @@ -32,6 +32,7 @@ #include "draw/draw_vs.h" #include "draw/draw_gs.h" +#include "draw/draw_tess.h" #include "gallivm/lp_bld_sample.h" #include "gallivm/lp_bld_limits.h" @@ -43,6 +44,8 @@ struct draw_llvm; struct llvm_vertex_shader; struct llvm_geometry_shader; +struct llvm_tess_ctrl_shader; +struct llvm_tess_eval_shader; struct draw_jit_texture { @@ -55,6 +58,8 @@ struct draw_jit_texture uint32_t first_level; uint32_t last_level; uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]; + uint32_t num_samples; + uint32_t sample_stride; }; @@ -92,6 +97,8 @@ struct draw_jit_image const void *base; uint32_t row_stride; uint32_t img_stride; + uint32_t num_samples; + uint32_t sample_stride; }; enum { @@ -104,6 +111,8 @@ enum { DRAW_JIT_TEXTURE_FIRST_LEVEL, DRAW_JIT_TEXTURE_LAST_LEVEL, DRAW_JIT_TEXTURE_MIP_OFFSETS, + DRAW_JIT_TEXTURE_NUM_SAMPLES, + DRAW_JIT_TEXTURE_SAMPLE_STRIDE, DRAW_JIT_TEXTURE_NUM_FIELDS /* number of fields above */ }; @@ -130,6 +139,8 @@ enum { DRAW_JIT_IMAGE_BASE, DRAW_JIT_IMAGE_ROW_STRIDE, DRAW_JIT_IMAGE_IMG_STRIDE, + DRAW_JIT_IMAGE_NUM_SAMPLES, + DRAW_JIT_IMAGE_SAMPLE_STRIDE, DRAW_JIT_IMAGE_NUM_FIELDS /* number of fields above */ }; @@ -317,6 +328,103 @@ enum { #define draw_gs_jit_context_num_ssbos(_gallivm, _ptr) \ lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_NUM_SSBOS, "num_ssbos") + +struct draw_tcs_jit_context { + const float *constants[LP_MAX_TGSI_CONST_BUFFERS]; + int num_constants[LP_MAX_TGSI_CONST_BUFFERS]; + + int dummy1; + int dummy2; + /* There two need to be exactly at DRAW_JIT_CTX_TEXTURES and + * DRAW_JIT_CTX_SAMPLERS positions in the struct */ + struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS]; + struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS]; + struct draw_jit_image images[PIPE_MAX_SHADER_IMAGES]; + + const uint32_t *ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; + int num_ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; +}; + +enum { + DRAW_TCS_JIT_CTX_CONSTANTS = 0, + DRAW_TCS_JIT_CTX_NUM_CONSTANTS = 1, + DRAW_TCS_JIT_CTX_TEXTURES = DRAW_JIT_CTX_TEXTURES, + DRAW_TCS_JIT_CTX_SAMPLERS = DRAW_JIT_CTX_SAMPLERS, + DRAW_TCS_JIT_CTX_IMAGES = DRAW_JIT_CTX_IMAGES, + DRAW_TCS_JIT_CTX_SSBOS = 7, + DRAW_TCS_JIT_CTX_NUM_SSBOS = 8, + DRAW_TCS_JIT_CTX_NUM_FIELDS = 9, +}; + +#define draw_tcs_jit_context_constants(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_CONSTANTS, "constants") + +#define draw_tcs_jit_context_num_constants(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_NUM_CONSTANTS, "num_constants") + +#define draw_tcs_jit_context_textures(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_TEXTURES, "textures") + +#define draw_tcs_jit_context_samplers(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_SAMPLERS, "samplers") + +#define draw_tcs_jit_context_images(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_IMAGES, "images") + +#define draw_tcs_jit_context_ssbos(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_SSBOS, "ssbos") + +#define draw_tcs_jit_context_num_ssbos(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_NUM_SSBOS, "num_ssbos") + +struct draw_tes_jit_context { + const float *constants[LP_MAX_TGSI_CONST_BUFFERS]; + int num_constants[LP_MAX_TGSI_CONST_BUFFERS]; + + int dummy1; + int dummy2; + /* There two need to be exactly at DRAW_JIT_CTX_TEXTURES and + * DRAW_JIT_CTX_SAMPLERS positions in the struct */ + struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS]; + struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS]; + struct draw_jit_image images[PIPE_MAX_SHADER_IMAGES]; + + const uint32_t *ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; + int num_ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; +}; + +enum { + DRAW_TES_JIT_CTX_CONSTANTS = 0, + DRAW_TES_JIT_CTX_NUM_CONSTANTS = 1, + DRAW_TES_JIT_CTX_TEXTURES = DRAW_JIT_CTX_TEXTURES, + DRAW_TES_JIT_CTX_SAMPLERS = DRAW_JIT_CTX_SAMPLERS, + DRAW_TES_JIT_CTX_IMAGES = DRAW_JIT_CTX_IMAGES, + DRAW_TES_JIT_CTX_SSBOS = 7, + DRAW_TES_JIT_CTX_NUM_SSBOS = 8, + DRAW_TES_JIT_CTX_NUM_FIELDS = 9, +}; + +#define draw_tes_jit_context_constants(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_CONSTANTS, "constants") + +#define draw_tes_jit_context_num_constants(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_NUM_CONSTANTS, "num_constants") + +#define draw_tes_jit_context_textures(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_TEXTURES, "textures") + +#define draw_tes_jit_context_samplers(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_SAMPLERS, "samplers") + +#define draw_tes_jit_context_images(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_IMAGES, "images") + +#define draw_tes_jit_context_ssbos(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_SSBOS, "ssbos") + +#define draw_tes_jit_context_num_ssbos(_gallivm, _ptr) \ + lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_NUM_SSBOS, "num_ssbos") + typedef boolean (*draw_jit_vert_func)(struct draw_jit_context *context, struct vertex_header *io, @@ -328,18 +436,34 @@ typedef boolean unsigned instance_id, unsigned vertex_id_offset, unsigned start_instance, - const unsigned *fetch_elts); + const unsigned *fetch_elts, + unsigned draw_id); typedef int (*draw_gs_jit_func)(struct draw_gs_jit_context *context, float inputs[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS], - struct vertex_header *output, + struct vertex_header **output, unsigned num_prims, unsigned instance_id, int *prim_ids, unsigned invocation_id); +typedef int +(*draw_tcs_jit_func)(struct draw_tcs_jit_context *context, + float inputs[32][NUM_TCS_INPUTS][TGSI_NUM_CHANNELS], + float outputs[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS], + uint32_t prim_id, uint32_t patch_vertices_in); + +typedef int +(*draw_tes_jit_func)(struct draw_tes_jit_context *context, + float inputs[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS], + struct vertex_header *io, + uint32_t prim_id, uint32_t num_tess_coord, + float *tess_coord_x, float *tess_coord_y, float *tess_outer, + float *tess_inner, uint32_t patch_vertices_in); + + struct draw_llvm_variant_key { unsigned nr_vertex_elements:8; @@ -353,7 +477,7 @@ struct draw_llvm_variant_key unsigned clip_halfz:1; unsigned bypass_viewport:1; unsigned need_edgeflags:1; - unsigned has_gs:1; + unsigned has_gs_or_tes:1; unsigned num_outputs:8; unsigned ucp_enable:PIPE_MAX_CLIP_PLANES; /* note padding here - must use memset */ @@ -381,6 +505,24 @@ struct draw_gs_llvm_variant_key /* Followed by variable number of images.*/ }; +struct draw_tcs_llvm_variant_key +{ + unsigned nr_samplers:8; + unsigned nr_sampler_views:8; + unsigned nr_images:8; + struct draw_sampler_static_state samplers[1]; + /* Followed by variable number of images.*/ +}; + +struct draw_tes_llvm_variant_key +{ + unsigned nr_samplers:8; + unsigned nr_sampler_views:8; + unsigned nr_images:8; + struct draw_sampler_static_state samplers[1]; + /* Followed by variable number of images.*/ +}; + #define DRAW_LLVM_MAX_VARIANT_KEY_SIZE \ (sizeof(struct draw_llvm_variant_key) + \ PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state) + \ @@ -392,6 +534,16 @@ struct draw_gs_llvm_variant_key PIPE_MAX_SHADER_IMAGES * sizeof(struct draw_image_static_state) + \ PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state)) +#define DRAW_TCS_LLVM_MAX_VARIANT_KEY_SIZE \ + (sizeof(struct draw_tcs_llvm_variant_key) + \ + PIPE_MAX_SHADER_IMAGES * sizeof(struct draw_image_static_state) + \ + PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state)) + +#define DRAW_TES_LLVM_MAX_VARIANT_KEY_SIZE \ + (sizeof(struct draw_tes_llvm_variant_key) + \ + PIPE_MAX_SHADER_IMAGES * sizeof(struct draw_image_static_state) + \ + PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state)) + static inline size_t draw_llvm_variant_key_size(unsigned nr_vertex_elements, @@ -412,6 +564,21 @@ draw_gs_llvm_variant_key_size(unsigned nr_samplers, unsigned nr_images) (nr_samplers - 1) * sizeof(struct draw_sampler_static_state)); } +static inline size_t +draw_tcs_llvm_variant_key_size(unsigned nr_samplers, unsigned nr_images) +{ + return (sizeof(struct draw_tcs_llvm_variant_key) + + (nr_images) * sizeof(struct draw_sampler_static_state) + + (nr_samplers - 1) * sizeof(struct draw_sampler_static_state)); +} + +static inline size_t +draw_tes_llvm_variant_key_size(unsigned nr_samplers, unsigned nr_images) +{ + return (sizeof(struct draw_tes_llvm_variant_key) + + (nr_images) * sizeof(struct draw_sampler_static_state) + + (nr_samplers - 1) * sizeof(struct draw_sampler_static_state)); +} static inline struct draw_sampler_static_state * draw_llvm_variant_key_samplers(struct draw_llvm_variant_key *key) @@ -436,6 +603,20 @@ draw_gs_llvm_variant_key_images(struct draw_gs_llvm_variant_key *key) &key->samplers[key->nr_samplers]; } +static inline struct draw_image_static_state * +draw_tcs_llvm_variant_key_images(struct draw_tcs_llvm_variant_key *key) +{ + return (struct draw_image_static_state *) + &key->samplers[key->nr_samplers]; +} + +static inline struct draw_image_static_state * +draw_tes_llvm_variant_key_images(struct draw_tes_llvm_variant_key *key) +{ + return (struct draw_image_static_state *) + &key->samplers[key->nr_samplers]; +} + struct draw_llvm_variant_list_item { struct draw_llvm_variant *base; @@ -448,6 +629,17 @@ struct draw_gs_llvm_variant_list_item struct draw_gs_llvm_variant_list_item *next, *prev; }; +struct draw_tcs_llvm_variant_list_item +{ + struct draw_tcs_llvm_variant *base; + struct draw_tcs_llvm_variant_list_item *next, *prev; +}; + +struct draw_tes_llvm_variant_list_item +{ + struct draw_tes_llvm_variant *base; + struct draw_tes_llvm_variant_list_item *next, *prev; +}; struct draw_llvm_variant { @@ -498,6 +690,57 @@ struct draw_gs_llvm_variant struct draw_gs_llvm_variant_key key; }; +struct draw_tcs_llvm_variant +{ + struct gallivm_state *gallivm; + + /* LLVM JIT builder types */ + LLVMTypeRef context_ptr_type; + LLVMTypeRef input_array_type; + LLVMTypeRef output_array_type; + + LLVMValueRef context_ptr; + LLVMValueRef io_ptr; + LLVMValueRef num_prims; + LLVMValueRef function; + draw_tcs_jit_func jit_func; + + struct llvm_tess_ctrl_shader *shader; + + struct draw_llvm *llvm; + struct draw_tcs_llvm_variant_list_item list_item_global; + struct draw_tcs_llvm_variant_list_item list_item_local; + + /* key is variable-sized, must be last */ + struct draw_tcs_llvm_variant_key key; +}; + +struct draw_tes_llvm_variant +{ + struct gallivm_state *gallivm; + + /* LLVM JIT builder types */ + LLVMTypeRef context_ptr_type; + LLVMTypeRef vertex_header_ptr_type; + LLVMTypeRef input_array_type; + LLVMTypeRef patch_input_array_type; + + LLVMValueRef context_ptr; + LLVMValueRef io_ptr; + LLVMValueRef num_prims; + LLVMValueRef function; + draw_tes_jit_func jit_func; + + struct llvm_tess_eval_shader *shader; + + struct draw_llvm *llvm; + struct draw_tes_llvm_variant_list_item list_item_global; + struct draw_tes_llvm_variant_list_item list_item_local; + + /* key is variable-sized, must be last */ + struct draw_tes_llvm_variant_key key; +}; + struct llvm_vertex_shader { struct draw_vertex_shader base; @@ -516,6 +759,23 @@ struct llvm_geometry_shader { unsigned variants_cached; }; +struct llvm_tess_ctrl_shader { + struct draw_tess_ctrl_shader base; + + unsigned variant_key_size; + struct draw_tcs_llvm_variant_list_item variants; + unsigned variants_created; + unsigned variants_cached; +}; + +struct llvm_tess_eval_shader { + struct draw_tess_eval_shader base; + + unsigned variant_key_size; + struct draw_tes_llvm_variant_list_item variants; + unsigned variants_created; + unsigned variants_cached; +}; struct draw_llvm { struct draw_context *draw; @@ -525,12 +785,20 @@ struct draw_llvm { struct draw_jit_context jit_context; struct draw_gs_jit_context gs_jit_context; + struct draw_tcs_jit_context tcs_jit_context; + struct draw_tes_jit_context tes_jit_context; struct draw_llvm_variant_list_item vs_variants_list; int nr_variants; struct draw_gs_llvm_variant_list_item gs_variants_list; int nr_gs_variants; + + struct draw_tcs_llvm_variant_list_item tcs_variants_list; + int nr_tcs_variants; + + struct draw_tes_llvm_variant_list_item tes_variants_list; + int nr_tes_variants; }; @@ -546,8 +814,17 @@ llvm_geometry_shader(struct draw_geometry_shader *gs) return (struct llvm_geometry_shader *)gs; } +static inline struct llvm_tess_ctrl_shader * +llvm_tess_ctrl_shader(struct draw_tess_ctrl_shader *tcs) +{ + return (struct llvm_tess_ctrl_shader *)tcs; +} - +static inline struct llvm_tess_eval_shader * +llvm_tess_eval_shader(struct draw_tess_eval_shader *tes) +{ + return (struct llvm_tess_eval_shader *)tes; +} struct draw_llvm * draw_llvm_create(struct draw_context *draw, LLVMContextRef llvm_context); @@ -584,11 +861,41 @@ draw_gs_llvm_make_variant_key(struct draw_llvm *llvm, char *store); void draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key); +struct draw_tcs_llvm_variant * +draw_tcs_llvm_create_variant(struct draw_llvm *llvm, + unsigned num_vertex_header_attribs, + const struct draw_tcs_llvm_variant_key *key); + +void +draw_tcs_llvm_destroy_variant(struct draw_tcs_llvm_variant *variant); + +struct draw_tcs_llvm_variant_key * +draw_tcs_llvm_make_variant_key(struct draw_llvm *llvm, char *store); + +void +draw_tcs_llvm_dump_variant_key(struct draw_tcs_llvm_variant_key *key); + +struct draw_tes_llvm_variant * +draw_tes_llvm_create_variant(struct draw_llvm *llvm, + unsigned num_vertex_header_attribs, + const struct draw_tes_llvm_variant_key *key); + +void +draw_tes_llvm_destroy_variant(struct draw_tes_llvm_variant *variant); + +struct draw_tes_llvm_variant_key * +draw_tes_llvm_make_variant_key(struct draw_llvm *llvm, char *store); + +void +draw_tes_llvm_dump_variant_key(struct draw_tes_llvm_variant_key *key); + struct lp_build_sampler_soa * -draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state); +draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state, + unsigned nr_samplers); struct lp_build_image_soa * -draw_llvm_image_soa_create(const struct draw_image_static_state *static_state); +draw_llvm_image_soa_create(const struct draw_image_static_state *static_state, + unsigned nr_images); void draw_llvm_set_sampler_state(struct draw_context *draw, @@ -600,6 +907,8 @@ draw_llvm_set_mapped_texture(struct draw_context *draw, unsigned sview_idx, uint32_t width, uint32_t height, uint32_t depth, uint32_t first_level, uint32_t last_level, + uint32_t num_samples, + uint32_t sample_stride, const void *base_ptr, uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS], uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS], @@ -612,5 +921,7 @@ draw_llvm_set_mapped_image(struct draw_context *draw, uint32_t width, uint32_t height, uint32_t depth, const void *base_ptr, uint32_t row_stride, - uint32_t img_stride); + uint32_t img_stride, + uint32_t num_samples, + uint32_t sample_stride); #endif