X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fvulkan%2Fprivate.h;h=873efaa48f511a9d9ed851910d830dab428bc684;hb=3a38b0db5fc7ab732fc6d830a2787b0b3c1bb294;hp=b957151cdbc0358946d7b6d8c4f97c3a8314d6c2;hpb=57153da2d5fe95e0eb731d827ba940028a80cf1c;p=mesa.git diff --git a/src/vulkan/private.h b/src/vulkan/private.h index b957151cdbc..873efaa48f5 100644 --- a/src/vulkan/private.h +++ b/src/vulkan/private.h @@ -234,9 +234,6 @@ struct anv_state_stream { void anv_block_pool_init(struct anv_block_pool *pool, struct anv_device *device, uint32_t block_size); -void anv_block_pool_init_slave(struct anv_block_pool *pool, - struct anv_block_pool *master_pool, - uint32_t num_blocks); void anv_block_pool_finish(struct anv_block_pool *pool); uint32_t anv_block_pool_alloc(struct anv_block_pool *pool); void anv_block_pool_free(struct anv_block_pool *pool, uint32_t offset); @@ -251,6 +248,24 @@ 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; @@ -280,15 +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 anv_blit_state { - VkPipeline pipeline; - VkDynamicRsState rs_state; - VkDescriptorSetLayout ds_layout; + struct { + VkDynamicRsState rs_state; + VkDynamicCbState cb_state; + VkDynamicDsState ds_state; + } shared; }; struct anv_device { @@ -300,16 +322,19 @@ struct anv_device { bool no_hw; bool dump_aub; + 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_block_pool binding_table_block_pool; struct anv_state_pool surface_state_pool; - struct anv_clear_state clear_state; - struct anv_blit_state blit_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; @@ -367,24 +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 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, @@ -401,17 +449,16 @@ 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 @@ -447,6 +494,12 @@ __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; @@ -462,36 +515,36 @@ 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_cb_state { - uint32_t blend_offset; +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_query_pool_slot { - uint64_t begin; - uint64_t end; - uint64_t available; +struct anv_dynamic_cb_state { + uint32_t state_color_calc[GEN8_COLOR_CALC_STATE_length]; + }; -struct anv_query_pool { - struct anv_object base; - VkQueryType type; - uint32_t slots; - struct anv_bo bo; +struct anv_descriptor_slot { + int8_t dynamic_slot; + uint8_t index; }; struct anv_descriptor_set_layout { struct { uint32_t surface_count; - uint32_t *surface_start; + struct anv_descriptor_slot *surface_start; uint32_t sampler_count; - uint32_t *sampler_start; + struct anv_descriptor_slot *sampler_start; } stage[VK_NUM_SHADER_STAGE]; uint32_t count; uint32_t num_dynamic_buffers; - uint32_t entries[0]; + uint32_t shader_stages; + struct anv_descriptor_slot entries[0]; }; struct anv_descriptor { @@ -532,19 +585,18 @@ struct anv_buffer { }; #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) - -struct anv_bindings { - struct { - struct anv_buffer *buffer; - VkDeviceSize offset; - } vb[MAX_VBS]; +#define ANV_CMD_BUFFER_DS_DIRTY (1 << 3) +#define ANV_CMD_BUFFER_CB_DIRTY (1 << 4) - struct { - uint32_t surfaces[256]; - struct { uint32_t dwords[4]; } samplers[16]; - } descriptors[VK_NUM_SHADER_STAGE]; +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 { @@ -554,27 +606,31 @@ struct anv_cmd_buffer { 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_bo surface_bo; + 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 binding_table_state_stream; struct anv_state_stream surface_state_stream; struct anv_state_stream dynamic_state_stream; /* State required while building cmd buffer */ uint32_t vb_dirty; 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_bindings * bindings; - struct anv_bindings default_bindings; + 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); @@ -597,6 +653,7 @@ 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; @@ -620,6 +677,7 @@ struct anv_pipeline { uint32_t active_stages; struct anv_state_stream program_stream; + struct anv_state blend_state; uint32_t vs_simd8; uint32_t ps_simd8; uint32_t ps_simd16; @@ -631,6 +689,7 @@ struct anv_pipeline { 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 { @@ -647,15 +706,17 @@ anv_pipeline_create(VkDevice device, const struct anv_pipeline_create_info *extra, VkPipeline *pPipeline); -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; - uint32_t cpp; - uint32_t channels; + const char * name; + uint16_t format; + uint8_t cpp; + uint8_t channels; + bool has_stencil; }; const struct anv_format * @@ -663,24 +724,45 @@ anv_format_for_vk_format(VkFormat format); struct anv_image { VkImageType type; - VkFormat format; 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_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; }; @@ -704,18 +786,29 @@ void anv_color_attachment_view_init(struct anv_surface_view *view, 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_surface_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; @@ -740,14 +833,12 @@ 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_cmd_buffer_fill_render_targets(struct anv_cmd_buffer *cmd_buffer); - void * anv_lookup_entrypoint(const char *name);