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);
struct anv_physical_device physicalDevice;
};
-struct anv_clear_state {
- VkPipeline pipeline;
- VkDynamicRsState rs_state;
- VkDynamicCbState cb_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;
- VkDynamicCbState cb_state;
+ struct {
+ VkDynamicRsState rs_state;
+ VkDynamicCbState cb_state;
+ VkDynamicDsState ds_state;
+ } shared;
};
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;
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,
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
};
-struct anv_query_pool_slot {
- uint64_t begin;
- uint64_t end;
- uint64_t available;
-};
-
-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 {
};
#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_bindings {
- struct {
- struct anv_buffer *buffer;
- VkDeviceSize offset;
- } vb[MAX_VBS];
- 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 {
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_dynamic_cb_state * cb_state;
- struct anv_bindings * bindings;
- struct anv_bindings default_bindings;
+ 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);
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;
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 {
+ const char * name;
uint16_t format;
uint8_t cpp;
uint8_t channels;
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;
};
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];
};
};
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);