#define VK_PROTOTYPES
#include <vulkan/vulkan.h>
+#include <vulkan/vulkan_intel.h>
+#include <vulkan/vk_wsi_lunarg.h>
-#undef VKAPI
-#define VKAPI __attribute__ ((visibility ("default")))
+#include "entrypoints.h"
#include "brw_context.h"
return error;
}
+void __anv_finishme(const char *file, int line, const char *format, ...);
+
+/**
+ * Print a FINISHME message, including its source location.
+ */
+#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
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;
struct anv_physical_device physicalDevice;
};
-struct anv_clear_state {
- VkPipeline pipeline;
- VkDynamicRsState rs_state;
-};
-
-struct anv_device {
- struct anv_instance * instance;
- uint32_t chipset_id;
- struct brw_device_info info;
- int context_id;
- int fd;
- bool no_hw;
- bool dump_aub;
-
- struct anv_block_pool dyn_state_block_pool;
- struct anv_state_pool dyn_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_meta_state {
+ struct {
+ VkPipeline pipeline;
+ } clear;
- struct anv_clear_state clear_state;
+ struct {
+ VkPipeline pipeline;
+ VkPipelineLayout pipeline_layout;
+ VkDescriptorSetLayout ds_layout;
+ } blit;
- struct anv_compiler * compiler;
- struct anv_aub_writer * aub_writer;
- pthread_mutex_t mutex;
+ struct {
+ VkDynamicRsState rs_state;
+ VkDynamicCbState cb_state;
+ VkDynamicDsState ds_state;
+ } shared;
};
struct anv_queue {
uint32_t last_collected_serial;
};
+struct anv_device {
+ struct anv_instance * instance;
+ uint32_t chipset_id;
+ struct brw_device_info info;
+ int context_id;
+ int fd;
+ 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_state_pool surface_state_pool;
+
+ struct anv_meta_state meta_state;
+
+ struct anv_state float_border_colors;
+ struct anv_state uint32_border_colors;
+
+ struct anv_queue queue;
+
+ struct anv_compiler * compiler;
+ struct anv_aub_writer * aub_writer;
+ pthread_mutex_t mutex;
+};
+
void *
anv_device_alloc(struct anv_device * device,
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,
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"
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;
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 {
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;
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;
};
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 *
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;
};
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
}