#define RADV_SUPPORT_ANDROID_HARDWARE_BUFFER 0
#endif
-enum radv_secure_compile_type {
- RADV_SC_TYPE_INIT_SUCCESS,
- RADV_SC_TYPE_INIT_FAILURE,
- RADV_SC_TYPE_COMPILE_PIPELINE,
- RADV_SC_TYPE_COMPILE_PIPELINE_FINISHED,
- RADV_SC_TYPE_READ_DISK_CACHE,
- RADV_SC_TYPE_WRITE_DISK_CACHE,
- RADV_SC_TYPE_FORK_DEVICE,
- RADV_SC_TYPE_DESTROY_DEVICE,
- RADV_SC_TYPE_COUNT
-};
-
#define radv_printflike(a, b) __attribute__((__format__(__printf__, a, b)))
static inline uint32_t
uint64_t debug_flags;
uint64_t perftest_flags;
- uint8_t num_sc_threads;
struct vk_debug_report_instance debug_report_callbacks;
bool enable_mrt_output_nan_fixup;
};
-static inline
-bool radv_device_use_secure_compile(struct radv_instance *instance)
-{
- return instance->num_sc_threads;
-}
-
VkResult radv_init_wsi(struct radv_physical_device *physical_device);
void radv_finish_wsi(struct radv_physical_device *physical_device);
uint32_t is_int10;
uint8_t log2_ps_iter_samples;
uint8_t num_samples;
+ bool is_dual_src;
uint32_t has_multiview_view_index : 1;
uint32_t optimisations_disabled : 1;
uint8_t topology;
#define RADV_MAX_QUEUE_FAMILIES 3
+struct radv_deferred_queue_submission;
+
enum ring_type radv_queue_family_to_ring(int f);
struct radv_queue {
struct list_head pending_submissions;
pthread_mutex_t pending_mutex;
+
+ pthread_mutex_t thread_mutex;
+ pthread_cond_t thread_cond;
+ struct radv_deferred_queue_submission *thread_submission;
+ pthread_t submission_thread;
+ bool thread_exit;
+ bool thread_running;
};
struct radv_bo_list {
void radv_bo_list_remove(struct radv_device *device,
struct radeon_winsys_bo *bo);
-struct radv_secure_compile_process {
- /* Secure process file descriptors. Used to communicate between the
- * user facing device and the idle forked device used to fork a clean
- * process for each new pipeline compile.
- */
- int fd_secure_input;
- int fd_secure_output;
-
- /* FIFO file descriptors used to communicate between the user facing
- * device and the secure process that does the actual secure compile.
- */
- int fd_server;
- int fd_client;
-
- /* Secure compile process id */
- pid_t sc_pid;
-
- /* Is the secure compile process currently in use by a thread */
- bool in_use;
-};
-
-struct radv_secure_compile_state {
- struct radv_secure_compile_process *secure_compile_processes;
- uint32_t secure_compile_thread_counter;
- mtx_t secure_compile_mutex;
-
- /* Unique process ID used to build name for FIFO file descriptor */
- char *uid;
-};
-
#define RADV_BORDER_COLOR_COUNT 4096
#define RADV_BORDER_COLOR_BUFFER_SIZE (sizeof(VkClearColorValue) * RADV_BORDER_COLOR_COUNT)
struct radv_device_border_color_data border_color_data;
- struct radv_secure_compile_state *sc_state;
-
/* Condition variable for legacy timelines, to notify waiters when a
* new point gets submitted. */
pthread_cond_t timeline_cond;
};
enum radv_dynamic_state_bits {
- RADV_DYNAMIC_VIEWPORT = 1 << 0,
- RADV_DYNAMIC_SCISSOR = 1 << 1,
- RADV_DYNAMIC_LINE_WIDTH = 1 << 2,
- RADV_DYNAMIC_DEPTH_BIAS = 1 << 3,
- RADV_DYNAMIC_BLEND_CONSTANTS = 1 << 4,
- RADV_DYNAMIC_DEPTH_BOUNDS = 1 << 5,
- RADV_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6,
- RADV_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7,
- RADV_DYNAMIC_STENCIL_REFERENCE = 1 << 8,
- RADV_DYNAMIC_DISCARD_RECTANGLE = 1 << 9,
- RADV_DYNAMIC_SAMPLE_LOCATIONS = 1 << 10,
- RADV_DYNAMIC_LINE_STIPPLE = 1 << 11,
- RADV_DYNAMIC_ALL = (1 << 12) - 1,
+ RADV_DYNAMIC_VIEWPORT = 1 << 0,
+ RADV_DYNAMIC_SCISSOR = 1 << 1,
+ RADV_DYNAMIC_LINE_WIDTH = 1 << 2,
+ RADV_DYNAMIC_DEPTH_BIAS = 1 << 3,
+ RADV_DYNAMIC_BLEND_CONSTANTS = 1 << 4,
+ RADV_DYNAMIC_DEPTH_BOUNDS = 1 << 5,
+ RADV_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6,
+ RADV_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7,
+ RADV_DYNAMIC_STENCIL_REFERENCE = 1 << 8,
+ RADV_DYNAMIC_DISCARD_RECTANGLE = 1 << 9,
+ RADV_DYNAMIC_SAMPLE_LOCATIONS = 1 << 10,
+ RADV_DYNAMIC_LINE_STIPPLE = 1 << 11,
+ RADV_DYNAMIC_CULL_MODE = 1 << 12,
+ RADV_DYNAMIC_FRONT_FACE = 1 << 13,
+ RADV_DYNAMIC_PRIMITIVE_TOPOLOGY = 1 << 14,
+ RADV_DYNAMIC_DEPTH_TEST_ENABLE = 1 << 15,
+ RADV_DYNAMIC_DEPTH_WRITE_ENABLE = 1 << 16,
+ RADV_DYNAMIC_DEPTH_COMPARE_OP = 1 << 17,
+ RADV_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE = 1 << 18,
+ RADV_DYNAMIC_STENCIL_TEST_ENABLE = 1 << 19,
+ RADV_DYNAMIC_STENCIL_OP = 1 << 20,
+ RADV_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE = 1 << 21,
+ RADV_DYNAMIC_ALL = (1 << 22) - 1,
};
enum radv_cmd_dirty_bits {
/* Keep the dynamic state dirty bits in sync with
* enum radv_dynamic_state_bits */
- RADV_CMD_DIRTY_DYNAMIC_VIEWPORT = 1 << 0,
- RADV_CMD_DIRTY_DYNAMIC_SCISSOR = 1 << 1,
- RADV_CMD_DIRTY_DYNAMIC_LINE_WIDTH = 1 << 2,
- RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS = 1 << 3,
- RADV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS = 1 << 4,
- RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS = 1 << 5,
- RADV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6,
- RADV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7,
- RADV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE = 1 << 8,
- RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE = 1 << 9,
- RADV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS = 1 << 10,
- RADV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE = 1 << 11,
- RADV_CMD_DIRTY_DYNAMIC_ALL = (1 << 12) - 1,
- RADV_CMD_DIRTY_PIPELINE = 1 << 12,
- RADV_CMD_DIRTY_INDEX_BUFFER = 1 << 13,
- RADV_CMD_DIRTY_FRAMEBUFFER = 1 << 14,
- RADV_CMD_DIRTY_VERTEX_BUFFER = 1 << 15,
- RADV_CMD_DIRTY_STREAMOUT_BUFFER = 1 << 16,
+ RADV_CMD_DIRTY_DYNAMIC_VIEWPORT = 1 << 0,
+ RADV_CMD_DIRTY_DYNAMIC_SCISSOR = 1 << 1,
+ RADV_CMD_DIRTY_DYNAMIC_LINE_WIDTH = 1 << 2,
+ RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS = 1 << 3,
+ RADV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS = 1 << 4,
+ RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS = 1 << 5,
+ RADV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6,
+ RADV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7,
+ RADV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE = 1 << 8,
+ RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE = 1 << 9,
+ RADV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS = 1 << 10,
+ RADV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE = 1 << 11,
+ RADV_CMD_DIRTY_DYNAMIC_CULL_MODE = 1 << 12,
+ RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE = 1 << 13,
+ RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY = 1 << 14,
+ RADV_CMD_DIRTY_DYNAMIC_DEPTH_TEST_ENABLE = 1 << 15,
+ RADV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE = 1 << 16,
+ RADV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP = 1 << 17,
+ RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE = 1 << 18,
+ RADV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE = 1 << 19,
+ RADV_CMD_DIRTY_DYNAMIC_STENCIL_OP = 1 << 20,
+ RADV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE = 1 << 21,
+ RADV_CMD_DIRTY_DYNAMIC_ALL = (1 << 22) - 1,
+ RADV_CMD_DIRTY_PIPELINE = 1 << 22,
+ RADV_CMD_DIRTY_INDEX_BUFFER = 1 << 23,
+ RADV_CMD_DIRTY_FRAMEBUFFER = 1 << 24,
+ RADV_CMD_DIRTY_VERTEX_BUFFER = 1 << 25,
+ RADV_CMD_DIRTY_STREAMOUT_BUFFER = 1 << 26,
};
enum radv_cmd_flush_bits {
struct radv_vertex_binding {
struct radv_buffer * buffer;
VkDeviceSize offset;
+ VkDeviceSize size;
+ VkDeviceSize stride;
};
struct radv_streamout_binding {
uint32_t back;
} stencil_write_mask;
+ struct {
+ struct {
+ VkStencilOp fail_op;
+ VkStencilOp pass_op;
+ VkStencilOp depth_fail_op;
+ VkCompareOp compare_op;
+ } front;
+
+ struct {
+ VkStencilOp fail_op;
+ VkStencilOp pass_op;
+ VkStencilOp depth_fail_op;
+ VkCompareOp compare_op;
+ } back;
+ } stencil_op;
+
struct {
uint32_t front;
uint32_t back;
uint32_t factor;
uint16_t pattern;
} line_stipple;
+
+ VkCullModeFlags cull_mode;
+ VkFrontFace front_face;
+ unsigned primitive_topology;
+
+ bool depth_test_enable;
+ bool depth_write_enable;
+ VkCompareOp depth_compare_op;
+ bool depth_bounds_test_enable;
+ bool stencil_test_enable;
};
extern const struct radv_dynamic_state default_dynamic_state;
struct radv_ds_buffer_info *ds,
struct radv_image_view *iview);
-bool
-radv_sc_read(int fd, void *buf, size_t size, bool timeout);
-
/**
* Attachment state when recording a renderpass instance.
*
uint32_t si_get_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer,
bool instanced_draw, bool indirect_draw,
bool count_from_stream_output,
- uint32_t draw_vertex_count);
+ uint32_t draw_vertex_count,
+ unsigned topology);
void si_cs_emit_write_event_eop(struct radeon_cmdbuf *cs,
enum chip_class chip_class,
bool is_mec,
bool radv_get_memory_fd(struct radv_device *device,
struct radv_device_memory *memory,
int *pFD);
+void radv_free_memory(struct radv_device *device,
+ const VkAllocationCallbacks* pAllocator,
+ struct radv_device_memory *mem);
static inline void
radv_emit_shader_pointer_head(struct radeon_cmdbuf *cs,
uint32_t base;
bool partial_es_wave;
uint8_t primgroup_size;
- bool wd_switch_on_eop;
bool ia_switch_on_eoi;
bool partial_vs_wave;
};
uint32_t vtx_base_sgpr;
struct radv_ia_multi_vgt_param_helpers ia_multi_vgt_param;
uint8_t vtx_emit_num;
- struct radv_prim_vertex_count prim_vertex_count;
bool can_use_guardband;
uint32_t needed_dynamic_state;
bool disable_out_of_order_rast_for_occlusion;
- uint8_t topology;
+ unsigned tess_patch_control_points;
+ unsigned pa_su_sc_mode_cntl;
+ unsigned db_depth_control;
+ bool uses_dynamic_stride;
/* Used for rbplus */
uint32_t col_format;
uint32_t cb_target_mask;
+ bool is_dual_src;
} graphics;
};
struct radv_image *image,
const VkImageSubresourceRange *range);
+typedef enum {
+ RADV_FENCE_NONE,
+ RADV_FENCE_WINSYS,
+ RADV_FENCE_SYNCOBJ,
+ RADV_FENCE_WSI,
+} radv_fence_kind;
+
+struct radv_fence_part {
+ radv_fence_kind kind;
+
+ union {
+ /* AMDGPU winsys fence. */
+ struct radeon_winsys_fence *fence;
+
+ /* DRM syncobj handle for syncobj-based fences. */
+ uint32_t syncobj;
+
+ /* WSI fence. */
+ struct wsi_fence *fence_wsi;
+ };
+};
+
struct radv_fence {
struct vk_object_base base;
- struct radeon_winsys_fence *fence;
- struct wsi_fence *fence_wsi;
-
- uint32_t syncobj;
- uint32_t temp_syncobj;
+ struct radv_fence_part permanent;
+ struct radv_fence_part temporary;
};
/* radv_nir_to_llvm.c */
const VkRenderPassBeginInfo *pRenderPassBegin);
void radv_cmd_buffer_end_render_pass(struct radv_cmd_buffer *cmd_buffer);
+static inline uint32_t si_translate_prim(unsigned topology)
+{
+ switch (topology) {
+ case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
+ return V_008958_DI_PT_POINTLIST;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
+ return V_008958_DI_PT_LINELIST;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
+ return V_008958_DI_PT_LINESTRIP;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+ return V_008958_DI_PT_TRILIST;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+ return V_008958_DI_PT_TRISTRIP;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
+ return V_008958_DI_PT_TRIFAN;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
+ return V_008958_DI_PT_LINELIST_ADJ;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
+ return V_008958_DI_PT_LINESTRIP_ADJ;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
+ return V_008958_DI_PT_TRILIST_ADJ;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
+ return V_008958_DI_PT_TRISTRIP_ADJ;
+ case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
+ return V_008958_DI_PT_PATCH;
+ default:
+ assert(0);
+ return 0;
+ }
+}
+
+static inline uint32_t si_translate_stencil_op(enum VkStencilOp op)
+{
+ switch (op) {
+ case VK_STENCIL_OP_KEEP:
+ return V_02842C_STENCIL_KEEP;
+ case VK_STENCIL_OP_ZERO:
+ return V_02842C_STENCIL_ZERO;
+ case VK_STENCIL_OP_REPLACE:
+ return V_02842C_STENCIL_REPLACE_TEST;
+ case VK_STENCIL_OP_INCREMENT_AND_CLAMP:
+ return V_02842C_STENCIL_ADD_CLAMP;
+ case VK_STENCIL_OP_DECREMENT_AND_CLAMP:
+ return V_02842C_STENCIL_SUB_CLAMP;
+ case VK_STENCIL_OP_INVERT:
+ return V_02842C_STENCIL_INVERT;
+ case VK_STENCIL_OP_INCREMENT_AND_WRAP:
+ return V_02842C_STENCIL_ADD_WRAP;
+ case VK_STENCIL_OP_DECREMENT_AND_WRAP:
+ return V_02842C_STENCIL_SUB_WRAP;
+ default:
+ return 0;
+ }
+}
+
#define RADV_DEFINE_HANDLE_CASTS(__radv_type, __VkType) \
\
static inline struct __radv_type * \