blob: 1008ea9ce3a97d91eff656c87a975f2eced2c88a [file] [log] [blame]
/*
* Copyright © 2016 Red Hat.
* Copyright © 2016 Bas Nieuwenhuizen
* SPDX-License-Identifier: MIT
*
* based in part on anv driver which is:
* Copyright © 2015 Intel Corporation
*/
#ifndef TU_PIPELINE_H
#define TU_PIPELINE_H
#include "tu_common.h"
#include "tu_cs.h"
#include "tu_descriptor_set.h"
#include "tu_shader.h"
#include "tu_suballoc.h"
enum tu_dynamic_state
{
/* re-use VK_DYNAMIC_STATE_ enums for non-extended dynamic states */
TU_DYNAMIC_STATE_SAMPLE_LOCATIONS = VK_DYNAMIC_STATE_STENCIL_REFERENCE + 1,
TU_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE,
TU_DYNAMIC_STATE_RB_DEPTH_CNTL,
TU_DYNAMIC_STATE_RB_STENCIL_CNTL,
TU_DYNAMIC_STATE_VB_STRIDE,
TU_DYNAMIC_STATE_PC_RASTER_CNTL,
TU_DYNAMIC_STATE_BLEND,
TU_DYNAMIC_STATE_VERTEX_INPUT,
TU_DYNAMIC_STATE_PATCH_CONTROL_POINTS,
TU_DYNAMIC_STATE_COUNT,
/* no associated draw state: */
TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY = TU_DYNAMIC_STATE_COUNT,
TU_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE,
TU_DYNAMIC_STATE_LOGIC_OP,
TU_DYNAMIC_STATE_LOGIC_OP_ENABLE,
TU_DYNAMIC_STATE_COLOR_WRITE_ENABLE,
TU_DYNAMIC_STATE_POLYGON_MODE,
TU_DYNAMIC_STATE_TESS_DOMAIN_ORIGIN,
TU_DYNAMIC_STATE_MSAA_SAMPLES,
TU_DYNAMIC_STATE_ALPHA_TO_COVERAGE,
TU_DYNAMIC_STATE_DEPTH_CLIP_RANGE,
TU_DYNAMIC_STATE_VIEWPORT_RANGE,
TU_DYNAMIC_STATE_LINE_MODE,
TU_DYNAMIC_STATE_PROVOKING_VTX,
TU_DYNAMIC_STATE_BLEND_ENABLE,
TU_DYNAMIC_STATE_BLEND_EQUATION,
TU_DYNAMIC_STATE_COLOR_WRITE_MASK,
/* re-use the line width enum as it uses GRAS_SU_CNTL: */
TU_DYNAMIC_STATE_RAST = VK_DYNAMIC_STATE_LINE_WIDTH,
};
struct cache_entry;
struct tu_lrz_pipeline
{
uint32_t force_disable_mask;
struct {
bool has_kill;
bool force_early_z;
bool early_fragment_tests;
} fs;
bool force_late_z;
};
struct tu_compiled_shaders
{
struct vk_pipeline_cache_object base;
struct tu_const_state const_state[MESA_SHADER_STAGES];
uint8_t active_desc_sets;
struct ir3_shader_variant *variants[MESA_SHADER_STAGES];
struct ir3_shader_variant *safe_const_variants[MESA_SHADER_STAGES];
};
struct tu_nir_shaders
{
struct vk_pipeline_cache_object base;
/* This is optional, and is only filled out when a library pipeline is
* compiled with RETAIN_LINK_TIME_OPTIMIZATION_INFO.
*/
nir_shader *nir[MESA_SHADER_STAGES];
};
extern const struct vk_pipeline_cache_object_ops tu_shaders_ops;
extern const struct vk_pipeline_cache_object_ops tu_nir_shaders_ops;
static bool inline
tu6_shared_constants_enable(const struct tu_pipeline_layout *layout,
const struct ir3_compiler *compiler)
{
return layout->push_constant_size > 0 &&
layout->push_constant_size <= (compiler->shared_consts_size * 16);
}
struct tu_program_descriptor_linkage
{
struct ir3_const_state const_state;
uint32_t constlen;
struct tu_const_state tu_const_state;
};
struct tu_pipeline_executable {
gl_shader_stage stage;
struct ir3_info stats;
bool is_binning;
char *nir_from_spirv;
char *nir_final;
char *disasm;
};
struct tu_pipeline
{
struct vk_object_base base;
struct tu_cs cs;
struct tu_suballoc_bo bo;
/* Separate BO for private memory since it should GPU writable */
struct tu_bo *pvtmem_bo;
VkShaderStageFlags active_stages;
uint32_t active_desc_sets;
/* mask of enabled dynamic states
* if BIT(i) is set, pipeline->dynamic_state[i] is *NOT* used
*/
uint64_t dynamic_state_mask;
struct tu_draw_state dynamic_state[TU_DYNAMIC_STATE_COUNT];
VkGraphicsPipelineLibraryFlagsEXT state;
/* for dynamic states which use the same register: */
struct {
uint32_t gras_su_cntl, gras_su_cntl_mask;
uint32_t gras_cl_cntl, gras_cl_cntl_mask;
uint32_t pc_raster_cntl, pc_raster_cntl_mask;
uint32_t vpc_unknown_9107, vpc_unknown_9107_mask;
uint32_t rb_depth_cntl, rb_depth_cntl_mask;
enum a5xx_line_mode line_mode;
enum a6xx_polygon_mode polygon_mode;
bool provoking_vertex_last;
bool override_depth_clip;
uint32_t multiview_mask;
} rast;
/* RB_DEPTH_CNTL state comes from both rast and depth/stencil state.
*/
struct {
uint32_t rb_depth_cntl, rb_depth_cntl_mask;
} rast_ds;
struct {
uint32_t rb_depth_cntl, rb_depth_cntl_mask;
uint32_t rb_stencil_cntl, rb_stencil_cntl_mask;
uint32_t stencil_wrmask;
bool raster_order_attachment_access;
bool write_enable;
} ds;
struct {
unsigned num_rts;
uint32_t rb_mrt_control[MAX_RTS], rb_mrt_control_mask;
uint32_t rb_mrt_control_rop;
uint32_t rb_mrt_blend_control[MAX_RTS];
uint32_t sp_blend_cntl, sp_blend_cntl_mask;
uint32_t rb_blend_cntl, rb_blend_cntl_mask;
uint32_t color_write_enable, blend_enable;
bool logic_op_enabled, rop_reads_dst;
bool raster_order_attachment_access;
} blend;
/* Misc. info from the fragment output interface state that is used
* elsewhere.
*/
struct {
/* memory bandwidth cost (in bytes) for color attachments */
uint32_t color_bandwidth_per_sample;
uint32_t depth_cpp_per_sample;
uint32_t stencil_cpp_per_sample;
bool rb_depth_cntl_disable;
VkSampleCountFlagBits samples;
bool subpass_feedback_loop_color, subpass_feedback_loop_ds;
bool feedback_loop_may_involve_textures;
} output;
/* In other words - framebuffer fetch support */
struct {
/* If the pipeline sets SINGLE_PRIM_MODE for sysmem. */
bool sysmem_single_prim_mode;
struct tu_draw_state state_sysmem, state_gmem;
} prim_order;
/* draw states for the pipeline */
struct tu_draw_state load_state;
struct {
uint32_t num_vbs;
} vi;
struct tu_push_constant_range shared_consts;
struct
{
struct tu_draw_state config_state;
struct tu_draw_state state;
struct tu_draw_state binning_state;
struct tu_program_descriptor_linkage link[MESA_SHADER_STAGES];
uint32_t vs_param_stride;
uint32_t hs_param_stride;
uint32_t hs_param_dwords;
uint32_t hs_vertices_out;
uint32_t cs_instrlen;
} program;
struct
{
enum pc_di_primtype primtype;
bool primitive_restart;
} ia;
struct
{
uint32_t patch_type;
uint32_t patch_control_points;
bool upper_left_domain_origin;
} tess;
struct
{
uint32_t local_size[3];
uint32_t subgroup_size;
} compute;
struct tu_lrz_pipeline lrz;
struct {
VkViewport viewports[MAX_VIEWPORTS];
unsigned num_viewports;
bool set_dynamic_vp_to_static;
bool z_negative_one_to_one;
} viewport;
/* Used only for libraries. compiled_shaders only contains variants compiled
* by this pipeline, and it owns them, so when it is freed they disappear.
* Similarly, nir_shaders owns the link-time NIR. shaders points to the
* shaders from this pipeline and all libraries included in it, for
* convenience.
*/
struct tu_compiled_shaders *compiled_shaders;
struct tu_nir_shaders *nir_shaders;
struct {
nir_shader *nir;
struct tu_shader_key key;
struct tu_const_state const_state;
struct ir3_shader_variant *variant, *safe_const_variant;
} shaders[MESA_SHADER_FRAGMENT + 1];
struct ir3_shader_key ir3_key;
/* Used for libraries, to stitch together an overall layout for the final
* pipeline.
*/
struct tu_descriptor_set_layout *layouts[MAX_SETS];
unsigned num_sets;
unsigned push_constant_size;
bool independent_sets;
void *executables_mem_ctx;
/* tu_pipeline_executable */
struct util_dynarray executables;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(tu_pipeline, base, VkPipeline,
VK_OBJECT_TYPE_PIPELINE)
void
tu6_emit_viewport(struct tu_cs *cs, const VkViewport *viewport, uint32_t num_viewport,
bool z_negative_one_to_one);
void
tu6_emit_scissor(struct tu_cs *cs, const VkRect2D *scs, uint32_t scissor_count);
void
tu6_emit_sample_locations(struct tu_cs *cs, const VkSampleLocationsInfoEXT *samp_loc);
void
tu6_emit_sample_locations_enable(struct tu_cs *cs, bool enable);
void
tu6_emit_depth_bias(struct tu_cs *cs,
float constant_factor,
float clamp,
float slope_factor);
#define TU6_EMIT_VERTEX_INPUT_MAX_DWORDS (MAX_VERTEX_ATTRIBS * 2 + 1)
void tu6_emit_vertex_input(struct tu_cs *cs,
uint32_t binding_count,
const VkVertexInputBindingDescription2EXT *bindings,
uint32_t attr_count,
const VkVertexInputAttributeDescription2EXT *attrs);
#define EMIT_CONST_DWORDS(const_dwords) (4 + const_dwords)
#define TU6_EMIT_PATCH_CONTROL_POINTS_DWORDS(hs_param_dwords) \
(EMIT_CONST_DWORDS(4) + EMIT_CONST_DWORDS(hs_param_dwords) + 2 + 2 + 2)
void tu6_emit_patch_control_points(struct tu_cs *cs,
const struct tu_pipeline *pipeline,
unsigned patch_control_points);
uint32_t tu6_rast_size(struct tu_device *dev);
void tu6_emit_rast(struct tu_cs *cs,
uint32_t gras_su_cntl,
uint32_t gras_cl_cntl,
enum a6xx_polygon_mode polygon_mode);
uint32_t tu6_rb_mrt_control_rop(VkLogicOp op, bool *rop_reads_dst);
struct tu_pvtmem_config {
uint64_t iova;
uint32_t per_fiber_size;
uint32_t per_sp_size;
bool per_wave;
};
void
tu6_emit_xs_config(struct tu_cs *cs,
gl_shader_stage stage,
const struct ir3_shader_variant *xs);
void
tu6_emit_xs(struct tu_cs *cs,
gl_shader_stage stage,
const struct ir3_shader_variant *xs,
const struct tu_pvtmem_config *pvtmem,
uint64_t binary_iova);
void
tu6_emit_vpc(struct tu_cs *cs,
const struct ir3_shader_variant *vs,
const struct ir3_shader_variant *hs,
const struct ir3_shader_variant *ds,
const struct ir3_shader_variant *gs,
const struct ir3_shader_variant *fs);
void
tu6_emit_fs_inputs(struct tu_cs *cs, const struct ir3_shader_variant *fs);
#endif /* TU_PIPELINE_H */