X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fvulkan%2Fprivate.h;h=873efaa48f511a9d9ed851910d830dab428bc684;hb=3a38b0db5fc7ab732fc6d830a2787b0b3c1bb294;hp=0ee0dabc25632ab50749c724e3c3a1baff935120;hpb=d3b374ce59c9366ef6fdf4b1e581a1a795bc3401;p=mesa.git diff --git a/src/vulkan/private.h b/src/vulkan/private.h index 0ee0dabc256..873efaa48f5 100644 --- a/src/vulkan/private.h +++ b/src/vulkan/private.h @@ -35,9 +35,10 @@ #define VK_PROTOTYPES #include +#include +#include -#undef VKAPI -#define VKAPI __attribute__ ((visibility ("default"))) +#include "entrypoints.h" #include "brw_context.h" @@ -93,6 +94,18 @@ void __anv_finishme(const char *file, int line, const char *format, ...); #define anv_finishme(format, ...) \ __anv_finishme(__FILE__, __LINE__, format, ##__VA_ARGS__); +#define stub_return(v) \ + do { \ + anv_finishme("stub %s", __func__); \ + return (v); \ + } while (0) + +#define stub(v) \ + do { \ + anv_finishme("stub %s", __func__); \ + return; \ + } while (0) + /** * A dynamically growable, circular buffer. Elements are added at head and * removed from tail. head and tail are free-running uint32_t indices and we @@ -235,6 +248,35 @@ void anv_state_stream_finish(struct anv_state_stream *stream); struct anv_state anv_state_stream_alloc(struct anv_state_stream *stream, uint32_t size, uint32_t alignment); +/** + * Implements a pool of re-usable BOs. The interface is identical to that + * of block_pool except that each block is its own BO. + */ +struct anv_bo_pool { + struct anv_device *device; + + uint32_t bo_size; + + void *free_list; +}; + +void anv_bo_pool_init(struct anv_bo_pool *pool, + struct anv_device *device, uint32_t block_size); +void anv_bo_pool_finish(struct anv_bo_pool *pool); +VkResult anv_bo_pool_alloc(struct anv_bo_pool *pool, struct anv_bo *bo); +void anv_bo_pool_free(struct anv_bo_pool *pool, const struct anv_bo *bo); + +struct anv_object; +struct anv_device; + +typedef void (*anv_object_destructor_cb)(struct anv_device *, + struct anv_object *, + VkObjectType); + +struct anv_object { + anv_object_destructor_cb destructor; +}; + struct anv_physical_device { struct anv_instance * instance; uint32_t chipset_id; @@ -253,9 +295,22 @@ struct anv_instance { struct anv_physical_device physicalDevice; }; -struct anv_clear_state { - VkPipeline pipeline; - VkDynamicRsState rs_state; +struct anv_meta_state { + struct { + VkPipeline pipeline; + } clear; + + struct { + VkPipeline pipeline; + VkPipelineLayout pipeline_layout; + VkDescriptorSetLayout ds_layout; + } blit; + + struct { + VkDynamicRsState rs_state; + VkDynamicCbState cb_state; + VkDynamicDsState ds_state; + } shared; }; struct anv_device { @@ -267,14 +322,19 @@ struct anv_device { bool no_hw; bool dump_aub; - struct anv_block_pool dyn_state_block_pool; - struct anv_state_pool dyn_state_pool; + struct anv_bo_pool batch_bo_pool; + + struct anv_block_pool dynamic_state_block_pool; + struct anv_state_pool dynamic_state_pool; struct anv_block_pool instruction_block_pool; struct anv_block_pool surface_state_block_pool; struct anv_state_pool surface_state_pool; - struct anv_clear_state clear_state; + struct anv_meta_state meta_state; + + struct anv_state float_border_colors; + struct anv_state uint32_border_colors; struct anv_compiler * compiler; struct anv_aub_writer * aub_writer; @@ -332,25 +392,47 @@ int anv_gem_userptr(struct anv_device *device, void *mem, size_t size); VkResult anv_bo_init_new(struct anv_bo *bo, struct anv_device *device, uint64_t size); -/* TODO: Remove hardcoded reloc limit. */ -#define ANV_BATCH_MAX_RELOCS 256 - struct anv_reloc_list { size_t num_relocs; - struct drm_i915_gem_relocation_entry relocs[ANV_BATCH_MAX_RELOCS]; - struct anv_bo * reloc_bos[ANV_BATCH_MAX_RELOCS]; + size_t array_length; + struct drm_i915_gem_relocation_entry * relocs; + struct anv_bo ** reloc_bos; }; -struct anv_batch { +VkResult anv_reloc_list_init(struct anv_reloc_list *list, + struct anv_device *device); +void anv_reloc_list_finish(struct anv_reloc_list *list, + struct anv_device *device); + +struct anv_batch_bo { struct anv_bo bo; + + /* Bytes actually consumed in this batch BO */ + size_t length; + + /* These offsets reference the per-batch reloc list */ + size_t first_reloc; + size_t num_relocs; + + struct anv_batch_bo * prev_batch_bo; +}; + +struct anv_batch { + struct anv_device * device; + + void * start; + void * end; void * next; - struct anv_reloc_list cmd_relocs; - struct anv_reloc_list surf_relocs; + + struct anv_reloc_list relocs; + + /* This callback is called (with the associated user data) in the event + * that the batch runs out of space. + */ + VkResult (*extend_cb)(struct anv_batch *, void *); + void * user_data; }; -VkResult anv_batch_init(struct anv_batch *batch, struct anv_device *device); -void anv_batch_finish(struct anv_batch *batch, struct anv_device *device); -void anv_batch_reset(struct anv_batch *batch); void *anv_batch_emit_dwords(struct anv_batch *batch, int num_dwords); void anv_batch_emit_batch(struct anv_batch *batch, struct anv_batch *other); uint64_t anv_batch_emit_reloc(struct anv_batch *batch, @@ -367,17 +449,18 @@ struct anv_address { static inline uint64_t __gen_combine_address(struct anv_batch *batch, void *location, const struct anv_address address, uint32_t delta) -{ +{ if (address.bo == NULL) { return delta; } else { - assert(batch->bo.map <= location && - (char *) location < (char *) batch->bo.map + batch->bo.size); + assert(batch->start <= location && location < batch->end); return anv_batch_emit_reloc(batch, location, address.bo, address.offset + delta); } } - + +#include "gen7_pack.h" +#include "gen75_pack.h" #undef GEN8_3DSTATE_MULTISAMPLE #include "gen8_pack.h" @@ -411,13 +494,20 @@ __gen_combine_address(struct anv_batch *batch, void *location, dw[i] = (dwords0)[i] | (dwords1)[i]; \ } while (0) +#define GEN8_MOCS { \ + .MemoryTypeLLCeLLCCacheabilityControl = WB, \ + .TargetCache = L3DefertoPATforLLCeLLCselection, \ + .AgeforQUADLRU = 0 \ + } + struct anv_device_memory { - struct anv_bo bo; - VkDeviceSize map_size; - void *map; + struct anv_bo bo; + VkDeviceSize map_size; + void * map; }; struct anv_dynamic_vp_state { + struct anv_object base; struct anv_state sf_clip_vp; struct anv_state cc_vp; struct anv_state scissor; @@ -425,38 +515,64 @@ struct anv_dynamic_vp_state { struct anv_dynamic_rs_state { uint32_t state_sf[GEN8_3DSTATE_SF_length]; + uint32_t state_raster[GEN8_3DSTATE_RASTER_length]; +}; + +struct anv_dynamic_ds_state { + uint32_t state_wm_depth_stencil[GEN8_3DSTATE_WM_DEPTH_STENCIL_length]; + uint32_t state_color_calc[GEN8_COLOR_CALC_STATE_length]; }; struct anv_dynamic_cb_state { - uint32_t blend_offset; + uint32_t state_color_calc[GEN8_COLOR_CALC_STATE_length]; + +}; + +struct anv_descriptor_slot { + int8_t dynamic_slot; + uint8_t index; }; struct anv_descriptor_set_layout { - uint32_t total; /* total number of entries in all stages */ - uint32_t count; struct { - VkDescriptorType type; - uint32_t mask; - } bindings[0]; + uint32_t surface_count; + struct anv_descriptor_slot *surface_start; + uint32_t sampler_count; + struct anv_descriptor_slot *sampler_start; + } stage[VK_NUM_SHADER_STAGE]; + + uint32_t count; + uint32_t num_dynamic_buffers; + uint32_t shader_stages; + struct anv_descriptor_slot entries[0]; }; -struct anv_descriptor_set { - void *descriptors[0]; +struct anv_descriptor { + struct anv_sampler *sampler; + struct anv_surface_view *view; }; -struct anv_pipeline_layout_entry { - VkDescriptorType type; - uint32_t set; - uint32_t index; +struct anv_descriptor_set { + struct anv_descriptor descriptors[0]; }; +#define MAX_VBS 32 +#define MAX_SETS 8 +#define MAX_RTS 8 + struct anv_pipeline_layout { struct { - uint32_t count; - struct anv_pipeline_layout_entry *entries; + struct anv_descriptor_set_layout *layout; + uint32_t surface_start[VK_NUM_SHADER_STAGE]; + uint32_t sampler_start[VK_NUM_SHADER_STAGE]; + } set[MAX_SETS]; + + uint32_t num_sets; + + struct { + uint32_t surface_count; + uint32_t sampler_count; } stage[VK_NUM_SHADER_STAGE]; - - struct anv_pipeline_layout_entry entries[0]; }; struct anv_buffer { @@ -468,53 +584,76 @@ struct anv_buffer { VkDeviceSize offset; }; -#define MAX_VBS 32 -#define MAX_SETS 8 -#define MAX_RTS 8 - #define ANV_CMD_BUFFER_PIPELINE_DIRTY (1 << 0) -#define ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY (1 << 1) #define ANV_CMD_BUFFER_RS_DIRTY (1 << 2) - +#define ANV_CMD_BUFFER_DS_DIRTY (1 << 3) +#define ANV_CMD_BUFFER_CB_DIRTY (1 << 4) + +struct anv_vertex_binding { + struct anv_buffer * buffer; + VkDeviceSize offset; +}; + +struct anv_descriptor_set_binding { + struct anv_descriptor_set * set; + uint32_t dynamic_offsets[128]; +}; + struct anv_cmd_buffer { + struct anv_object base; struct anv_device * device; struct drm_i915_gem_execbuffer2 execbuf; struct drm_i915_gem_exec_object2 * exec2_objects; struct anv_bo ** exec2_bos; + uint32_t exec2_array_length; bool need_reloc; uint32_t serial; uint32_t bo_count; struct anv_batch batch; + struct anv_batch_bo * last_batch_bo; + struct anv_batch_bo * surface_batch_bo; + uint32_t surface_next; + struct anv_reloc_list surface_relocs; struct anv_state_stream surface_state_stream; + struct anv_state_stream dynamic_state_stream; /* State required while building cmd buffer */ - struct { - struct anv_buffer *buffer; - VkDeviceSize offset; - } vb[MAX_VBS]; uint32_t vb_dirty; - uint32_t num_descriptor_sets; - struct anv_descriptor_set * descriptor_sets[MAX_SETS]; uint32_t dirty; + uint32_t descriptors_dirty; struct anv_pipeline * pipeline; struct anv_framebuffer * framebuffer; struct anv_dynamic_rs_state * rs_state; + struct anv_dynamic_ds_state * ds_state; struct anv_dynamic_vp_state * vp_state; + struct anv_dynamic_cb_state * cb_state; + struct anv_vertex_binding vertex_bindings[MAX_VBS]; + struct anv_descriptor_set_binding descriptors[MAX_SETS]; }; void anv_cmd_buffer_dump(struct anv_cmd_buffer *cmd_buffer); void anv_aub_writer_destroy(struct anv_aub_writer *writer); +struct anv_fence { + struct anv_object base; + struct anv_bo bo; + struct drm_i915_gem_execbuffer2 execbuf; + struct drm_i915_gem_exec_object2 exec2_objects[1]; + bool ready; +}; + struct anv_shader { uint32_t size; char data[0]; }; struct anv_pipeline { + struct anv_object base; struct anv_device * device; struct anv_batch batch; + uint32_t batch_data[256]; struct anv_shader * shaders[VK_NUM_SHADER_STAGE]; struct anv_pipeline_layout * layout; bool use_repclear; @@ -537,24 +676,27 @@ struct anv_pipeline { struct anv_bo gs_scratch_bo; uint32_t active_stages; - uint32_t program_block; - uint32_t program_next; + struct anv_state_stream program_stream; + struct anv_state blend_state; uint32_t vs_simd8; uint32_t ps_simd8; uint32_t ps_simd16; uint32_t gs_vec4; uint32_t gs_vertex_count; + uint32_t vb_used; uint32_t binding_stride[MAX_VBS]; uint32_t state_sf[GEN8_3DSTATE_SF_length]; uint32_t state_raster[GEN8_3DSTATE_RASTER_length]; + uint32_t state_wm_depth_stencil[GEN8_3DSTATE_WM_DEPTH_STENCIL_length]; }; struct anv_pipeline_create_info { bool use_repclear; bool disable_viewport; bool disable_scissor; + bool disable_vs; bool use_rectlist; }; @@ -564,17 +706,17 @@ anv_pipeline_create(VkDevice device, const struct anv_pipeline_create_info *extra, VkPipeline *pPipeline); -VkResult anv_pipeline_destroy(struct anv_pipeline *pipeline); - -struct anv_compiler *anv_compiler_create(int fd); +struct anv_compiler *anv_compiler_create(struct anv_device *device); void anv_compiler_destroy(struct anv_compiler *compiler); int anv_compiler_run(struct anv_compiler *compiler, struct anv_pipeline *pipeline); void anv_compiler_free(struct anv_pipeline *pipeline); struct anv_format { - uint32_t format; - int32_t cpp; - int32_t channels; + const char * name; + uint16_t format; + uint8_t cpp; + uint8_t channels; + bool has_stencil; }; const struct anv_format * @@ -583,39 +725,90 @@ anv_format_for_vk_format(VkFormat format); struct anv_image { VkImageType type; VkExtent3D extent; + VkFormat format; uint32_t tile_mode; VkDeviceSize size; uint32_t alignment; - int32_t stride; + uint32_t stride; + + uint32_t stencil_offset; + uint32_t stencil_stride; /* Set when bound */ struct anv_bo * bo; VkDeviceSize offset; + + struct anv_swap_chain * swap_chain; + + /** + * \name Alignment of miptree images, in units of pixels. + * + * These fields contain the actual alignment values, not the values the + * hardware expects. For example, if h_align is 4, then program the hardware + * with HALIGN_4. + * + * \see RENDER_SURFACE_STATE.SurfaceHorizontalAlignment + * \see RENDER_SURFACE_STATE.SurfaceVerticalAlignment + * \{ + */ + uint8_t h_align; + uint8_t v_align; + /** \} */ }; -struct anv_buffer_view { - struct anv_buffer * buffer; +struct anv_surface_view { + struct anv_object base; + struct anv_state surface_state; + struct anv_bo * bo; uint32_t offset; + uint32_t range; + VkExtent3D extent; + VkFormat format; }; -struct anv_color_attachment_view { - struct anv_image * image; - struct anv_state surface_state; +struct anv_image_create_info { + uint32_t tile_mode; }; -struct anv_image_view { - struct anv_image * image; - struct anv_state surface_state; +VkResult anv_image_create(VkDevice _device, + const VkImageCreateInfo *pCreateInfo, + const struct anv_image_create_info *extra, + VkImage *pImage); + +void anv_image_view_init(struct anv_surface_view *view, + struct anv_device *device, + const VkImageViewCreateInfo* pCreateInfo, + struct anv_cmd_buffer *cmd_buffer); + +void anv_color_attachment_view_init(struct anv_surface_view *view, + struct anv_device *device, + const VkColorAttachmentViewCreateInfo* pCreateInfo, + struct anv_cmd_buffer *cmd_buffer); + +void anv_surface_view_destroy(struct anv_device *device, + struct anv_object *obj, VkObjectType obj_type); + +struct anv_sampler { + uint32_t state[4]; }; struct anv_depth_stencil_view { + struct anv_bo * bo; + + uint32_t depth_offset; + uint32_t depth_stride; + uint32_t depth_format; + + uint32_t stencil_offset; + uint32_t stencil_stride; }; struct anv_framebuffer { + struct anv_object base; uint32_t color_attachment_count; - struct anv_color_attachment_view * color_attachments[MAX_RTS]; - struct anv_depth_stencil_view * depth_stencil; + const struct anv_surface_view * color_attachments[MAX_RTS]; + const struct anv_depth_stencil_view * depth_stencil; uint32_t sample_count; uint32_t width; @@ -640,11 +833,14 @@ struct anv_render_pass { }; void anv_device_init_meta(struct anv_device *device); +void anv_device_finish_meta(struct anv_device *device); void anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer, struct anv_render_pass *pass); +void * +anv_lookup_entrypoint(const char *name); #ifdef __cplusplus }