Path: blob/21.2-virgl/src/gallium/drivers/nouveau/nv50/nv50_blit.h
4574 views
1#ifndef __NV50_BLIT_H__2#define __NV50_BLIT_H__34#include "util/u_inlines.h"5#include "util/format/u_format.h"67void *8nv50_blitter_make_fp(struct pipe_context *,9unsigned mode,10enum pipe_texture_target);1112unsigned13nv50_blit_select_mode(const struct pipe_blit_info *);1415/* Converted to a pipe->blit. */16void17nv50_resource_resolve(struct pipe_context *, const struct pipe_resolve_info *);1819#define NV50_BLIT_MODE_PASS 0 /* pass through TEX $t0/$s0 output */20#define NV50_BLIT_MODE_Z24S8 1 /* encode ZS values for RGBA unorm8 */21#define NV50_BLIT_MODE_S8Z24 222#define NV50_BLIT_MODE_X24S8 323#define NV50_BLIT_MODE_S8X24 424#define NV50_BLIT_MODE_Z24X8 525#define NV50_BLIT_MODE_X8Z24 626#define NV50_BLIT_MODE_ZS 7 /* put $t0/$s0 into R, $t1/$s1 into G */27#define NV50_BLIT_MODE_XS 8 /* put $t1/$s1 into G */28#define NV50_BLIT_MODE_INT_CLAMP 9 /* unsigned to signed integer conversion */29#define NV50_BLIT_MODES 103031/* CUBE and RECT textures are reinterpreted as 2D(_ARRAY) */32#define NV50_BLIT_TEXTURE_BUFFER 033#define NV50_BLIT_TEXTURE_1D 134#define NV50_BLIT_TEXTURE_2D 235#define NV50_BLIT_TEXTURE_3D 336#define NV50_BLIT_TEXTURE_1D_ARRAY 437#define NV50_BLIT_TEXTURE_2D_ARRAY 538#define NV50_BLIT_MAX_TEXTURE_TYPES 63940static inline unsigned41nv50_blit_texture_type(enum pipe_texture_target target)42{43switch (target) {44case PIPE_TEXTURE_1D: return NV50_BLIT_TEXTURE_1D;45case PIPE_TEXTURE_2D: return NV50_BLIT_TEXTURE_2D;46case PIPE_TEXTURE_3D: return NV50_BLIT_TEXTURE_3D;47case PIPE_TEXTURE_1D_ARRAY: return NV50_BLIT_TEXTURE_1D_ARRAY;48case PIPE_TEXTURE_2D_ARRAY: return NV50_BLIT_TEXTURE_2D_ARRAY;49default:50assert(target == PIPE_BUFFER);51return NV50_BLIT_TEXTURE_BUFFER;52}53}5455static inline unsigned56nv50_blit_get_tgsi_texture_target(enum pipe_texture_target target)57{58switch (target) {59case PIPE_TEXTURE_1D: return TGSI_TEXTURE_1D;60case PIPE_TEXTURE_2D: return TGSI_TEXTURE_2D;61case PIPE_TEXTURE_3D: return TGSI_TEXTURE_3D;62case PIPE_TEXTURE_1D_ARRAY: return TGSI_TEXTURE_1D_ARRAY;63case PIPE_TEXTURE_2D_ARRAY: return TGSI_TEXTURE_2D_ARRAY;64default:65assert(target == PIPE_BUFFER);66return TGSI_TEXTURE_BUFFER;67}68}6970static inline enum pipe_texture_target71nv50_blit_reinterpret_pipe_texture_target(enum pipe_texture_target target)72{73switch (target) {74case PIPE_TEXTURE_CUBE:75case PIPE_TEXTURE_CUBE_ARRAY:76return PIPE_TEXTURE_2D_ARRAY;77case PIPE_TEXTURE_RECT:78return PIPE_TEXTURE_2D;79default:80return target;81}82}8384static inline unsigned85nv50_blit_get_filter(const struct pipe_blit_info *info)86{87if (info->dst.resource->nr_samples < info->src.resource->nr_samples)88return (util_format_is_depth_or_stencil(info->src.format) ||89util_format_is_pure_integer(info->src.format)) ? 0 : 1;9091if (info->filter != PIPE_TEX_FILTER_LINEAR)92return 0;9394if ((info->dst.box.width == info->src.box.width ||95info->dst.box.width == -info->src.box.width) &&96(info->dst.box.height == info->src.box.height ||97info->dst.box.height == -info->src.box.height))98return 0;99100return 1;101}102103/* Since shaders cannot export stencil, we cannot copy stencil values when104* rendering to ZETA, so we attach the ZS surface to a colour render target.105*/106static inline enum pipe_format107nv50_blit_zeta_to_colour_format(enum pipe_format format)108{109switch (format) {110case PIPE_FORMAT_Z16_UNORM:111return PIPE_FORMAT_R16_UNORM;112case PIPE_FORMAT_Z24_UNORM_S8_UINT:113case PIPE_FORMAT_S8_UINT_Z24_UNORM:114case PIPE_FORMAT_Z24X8_UNORM:115case PIPE_FORMAT_X8Z24_UNORM:116case PIPE_FORMAT_X24S8_UINT:117case PIPE_FORMAT_S8X24_UINT:118return PIPE_FORMAT_R8G8B8A8_UNORM;119case PIPE_FORMAT_Z32_FLOAT:120return PIPE_FORMAT_R32_FLOAT;121case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:122case PIPE_FORMAT_X32_S8X24_UINT:123return PIPE_FORMAT_R32G32_FLOAT;124default:125assert(0);126return PIPE_FORMAT_NONE;127}128}129130131static inline uint16_t132nv50_blit_derive_color_mask(const struct pipe_blit_info *info)133{134const unsigned mask = info->mask;135136uint16_t color_mask = 0;137138switch (info->dst.format) {139case PIPE_FORMAT_Z24X8_UNORM:140case PIPE_FORMAT_X24S8_UINT:141case PIPE_FORMAT_Z24_UNORM_S8_UINT:142if (mask & PIPE_MASK_S)143color_mask |= 0x1000;144if (mask & PIPE_MASK_Z)145color_mask |= 0x0111;146break;147case PIPE_FORMAT_X8Z24_UNORM:148case PIPE_FORMAT_S8X24_UINT:149case PIPE_FORMAT_S8_UINT_Z24_UNORM:150if (mask & PIPE_MASK_S)151color_mask |= 0x0001;152if (mask & PIPE_MASK_Z)153color_mask |= 0x1110;154break;155default:156if (mask & (PIPE_MASK_R | PIPE_MASK_Z)) color_mask |= 0x0001;157if (mask & (PIPE_MASK_G | PIPE_MASK_S)) color_mask |= 0x0010;158if (mask & PIPE_MASK_B) color_mask |= 0x0100;159if (mask & PIPE_MASK_A) color_mask |= 0x1000;160break;161}162163return color_mask;164}165166static inline uint32_t167nv50_blit_eng2d_get_mask(const struct pipe_blit_info *info)168{169uint32_t mask = 0;170171switch (info->dst.format) {172case PIPE_FORMAT_Z24X8_UNORM:173case PIPE_FORMAT_X24S8_UINT:174case PIPE_FORMAT_Z24_UNORM_S8_UINT:175if (info->mask & PIPE_MASK_Z) mask |= 0x00ffffff;176if (info->mask & PIPE_MASK_S) mask |= 0xff000000;177break;178case PIPE_FORMAT_X8Z24_UNORM:179case PIPE_FORMAT_S8X24_UINT:180case PIPE_FORMAT_S8_UINT_Z24_UNORM:181if (info->mask & PIPE_MASK_Z) mask |= 0xffffff00;182if (info->mask & PIPE_MASK_S) mask |= 0x000000ff;183break;184default:185mask = 0xffffffff;186break;187}188return mask;189}190191#if NOUVEAU_DRIVER == 0xc0192# define nv50_format_table nvc0_format_table193#endif194195/* return true for formats that can be converted among each other by NVC0_2D */196static inline bool197nv50_2d_dst_format_faithful(enum pipe_format format)198{199const uint64_t mask =200NV50_ENG2D_SUPPORTED_FORMATS &201~NV50_ENG2D_NOCONVERT_FORMATS;202uint8_t id = nv50_format_table[format].rt;203return (id >= 0xc0) && (mask & (1ULL << (id - 0xc0)));204}205static inline bool206nv50_2d_src_format_faithful(enum pipe_format format)207{208const uint64_t mask =209NV50_ENG2D_SUPPORTED_FORMATS &210~(NV50_ENG2D_LUMINANCE_FORMATS | NV50_ENG2D_INTENSITY_FORMATS);211uint8_t id = nv50_format_table[format].rt;212return (id >= 0xc0) && (mask & (1ULL << (id - 0xc0)));213}214215static inline bool216nv50_2d_format_supported(enum pipe_format format)217{218uint8_t id = nv50_format_table[format].rt;219return (id >= 0xc0) &&220(NV50_ENG2D_SUPPORTED_FORMATS & (1ULL << (id - 0xc0)));221}222223static inline bool224nv50_2d_dst_format_ops_supported(enum pipe_format format)225{226uint8_t id = nv50_format_table[format].rt;227return (id >= 0xc0) &&228(NV50_ENG2D_OPERATION_FORMATS & (1ULL << (id - 0xc0)));229}230231#endif /* __NV50_BLIT_H__ */232233234