blob: 386b305d29943a30df7eb7456dcd95b9a1bdd6f3 [file] [edit]
/*
* 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_SHADER_H
#define TU_SHADER_H
#include "tu_common.h"
#include "tu_cs.h"
#include "tu_suballoc.h"
#include "tu_descriptor_set.h"
struct tu_inline_ubo
{
/* Push the data at BINDLESS_BASE[base] + offset */
unsigned base;
unsigned offset;
/* If true, push the base address instead */
bool push_address;
/* Push it to this location in the const file, in vec4s */
unsigned const_offset_vec4;
/* How much to push */
unsigned size_vec4;
};
/* The meaning of the range depends on "type". If it's
* IR3_PUSH_CONSTS_PER_STAGE, then it's the range used by this shader. If
* it's IR3_PUSH_CONSTS_SHARED then it's the overall range as provided by
* the pipeline layout and must match between shaders where it's non-zero.
*/
struct tu_push_constant_range
{
uint32_t lo;
uint32_t dwords;
enum ir3_push_consts_type type;
};
struct tu_const_state
{
struct tu_push_constant_range push_consts;
uint32_t dynamic_offset_loc;
unsigned num_inline_ubos;
struct tu_inline_ubo ubos[MAX_INLINE_UBOS];
struct ir3_driver_ubo fdm_ubo;
struct ir3_driver_ubo dynamic_offsets_ubo;
struct ir3_driver_ubo inline_uniforms_ubo;
};
struct tu_shader
{
struct vk_pipeline_cache_object base;
const struct ir3_shader_variant *variant;
const struct ir3_shader_variant *safe_const_variant;
struct tu_suballoc_bo bo;
struct tu_cs cs;
struct tu_bo *pvtmem_bo;
struct tu_draw_state state;
struct tu_draw_state safe_const_state;
struct tu_draw_state binning_state;
struct tu_const_state const_state;
uint32_t view_mask;
uint8_t active_desc_sets;
/* The dynamic buffer descriptor size for descriptor sets that we know
* about. This is used when linking to piece together the sizes and from
* there calculate the offsets. It's -1 if we don't know because the
* descriptor set layout is NULL.
*/
int dynamic_descriptor_sizes[MAX_SETS];
union {
struct {
unsigned patch_type;
enum a6xx_tess_output tess_output_upper_left, tess_output_lower_left;
enum a6xx_tess_spacing tess_spacing;
} tes;
struct {
bool per_samp;
bool has_fdm;
struct {
uint32_t status;
bool force_late_z;
} lrz;
} fs;
};
};
struct tu_shader_key {
unsigned multiview_mask;
bool force_sample_interp;
bool fragment_density_map;
uint8_t unscaled_input_fragcoord;
enum ir3_wavesize_option api_wavesize, real_wavesize;
};
extern const struct vk_pipeline_cache_object_ops tu_shader_ops;
bool
tu_nir_lower_multiview(nir_shader *nir, uint32_t mask, struct tu_device *dev);
nir_shader *
tu_spirv_to_nir(struct tu_device *dev,
void *mem_ctx,
const VkPipelineShaderStageCreateInfo *stage_info,
gl_shader_stage stage);
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);
template <chip CHIP>
void
tu6_emit_vs(struct tu_cs *cs, const struct ir3_shader_variant *vs,
uint32_t view_mask);
template <chip CHIP>
void
tu6_emit_hs(struct tu_cs *cs, const struct ir3_shader_variant *hs);
template <chip CHIP>
void
tu6_emit_ds(struct tu_cs *cs, const struct ir3_shader_variant *hs);
template <chip CHIP>
void
tu6_emit_gs(struct tu_cs *cs, const struct ir3_shader_variant *hs);
template <chip CHIP>
void
tu6_emit_fs(struct tu_cs *cs, const struct ir3_shader_variant *fs);
VkResult
tu_shader_create(struct tu_device *dev,
struct tu_shader **shader_out,
nir_shader *nir,
const struct tu_shader_key *key,
const struct ir3_shader_key *ir3_key,
const void *key_data,
size_t key_size,
struct tu_pipeline_layout *layout,
bool executable_info);
void
tu_shader_key_subgroup_size(struct tu_shader_key *key,
bool allow_varying_subgroup_size,
bool require_full_subgroups,
const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *subgroup_info,
struct tu_device *dev);
VkResult
tu_compile_shaders(struct tu_device *device,
const VkPipelineShaderStageCreateInfo **stage_infos,
nir_shader **nir,
const struct tu_shader_key *keys,
struct tu_pipeline_layout *layout,
const unsigned char *pipeline_sha1,
struct tu_shader **shaders,
char **nir_initial_disasm,
void *nir_initial_disasm_mem_ctx,
nir_shader **nir_out,
VkPipelineCreationFeedback *stage_feedbacks);
VkResult
tu_init_empty_shaders(struct tu_device *device);
void
tu_destroy_empty_shaders(struct tu_device *device);
void
tu_shader_destroy(struct tu_device *dev,
struct tu_shader *shader);
#endif /* TU_SHADER_H */