mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 22:38:05 +02:00
vc4: Add #defines for the texture uniform fields.
I wanted to make another set of texture uploads for handling reladdr constants, and duplicating all the bitshifting looked like a terrible idea. In the process, this fixes a swap of the s/t texture wrap modes.
This commit is contained in:
parent
5cfab07639
commit
5c72d7706c
2 changed files with 113 additions and 19 deletions
|
|
@ -81,6 +81,18 @@ enum vc4_packet {
|
|||
VC4_PACKET_GEM_HANDLES = 254,
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
|
||||
#define VC4_MASK(high, low) (((1 << ((high) - (low) + 1)) - 1) << (low))
|
||||
/* Using the GNU statement expression extension */
|
||||
#define VC4_SET_FIELD(value, field) \
|
||||
({ \
|
||||
uint32_t fieldval = (value) << field ## _SHIFT; \
|
||||
assert((fieldval & ~ field ## _MASK) == 0); \
|
||||
fieldval & field ## _MASK; \
|
||||
})
|
||||
|
||||
#define VC4_GET_FIELD(word, field) (((word) & field ## _MASK) >> field ## _SHIFT)
|
||||
|
||||
/** @{
|
||||
* Bits used by packets like VC4_PACKET_STORE_TILE_BUFFER_GENERAL and
|
||||
* VC4_PACKET_TILE_RENDERING_MODE_CONFIG.
|
||||
|
|
@ -244,4 +256,74 @@ enum vc4_texture_data_type {
|
|||
VC4_TEXTURE_TYPE_YUV422R = 17,
|
||||
};
|
||||
|
||||
#define VC4_TEX_P0_OFFSET_MASK VC4_MASK(31, 12)
|
||||
#define VC4_TEX_P0_OFFSET_SHIFT 12
|
||||
#define VC4_TEX_P0_CSWIZ_MASK VC4_MASK(11, 10)
|
||||
#define VC4_TEX_P0_CSWIZ_SHIFT 10
|
||||
#define VC4_TEX_P0_CMMODE_MASK VC4_MASK(9, 9)
|
||||
#define VC4_TEX_P0_CMMODE_SHIFT 9
|
||||
#define VC4_TEX_P0_FLIPY_MASK VC4_MASK(8, 8)
|
||||
#define VC4_TEX_P0_FLIPY_SHIFT 8
|
||||
#define VC4_TEX_P0_TYPE_MASK VC4_MASK(7, 4)
|
||||
#define VC4_TEX_P0_TYPE_SHIFT 4
|
||||
#define VC4_TEX_P0_MIPLVLS_MASK VC4_MASK(3, 0)
|
||||
#define VC4_TEX_P0_MIPLVLS_SHIFT 0
|
||||
|
||||
#define VC4_TEX_P1_TYPE4_MASK VC4_MASK(31, 31)
|
||||
#define VC4_TEX_P1_TYPE4_SHIFT 31
|
||||
#define VC4_TEX_P1_HEIGHT_MASK VC4_MASK(30, 20)
|
||||
#define VC4_TEX_P1_HEIGHT_SHIFT 20
|
||||
#define VC4_TEX_P1_ETCFLIP_MASK VC4_MASK(19, 19)
|
||||
#define VC4_TEX_P1_ETCFLIP_SHIFT 19
|
||||
#define VC4_TEX_P1_WIDTH_MASK VC4_MASK(18, 8)
|
||||
#define VC4_TEX_P1_WIDTH_SHIFT 8
|
||||
|
||||
#define VC4_TEX_P1_MAGFILT_MASK VC4_MASK(7, 7)
|
||||
#define VC4_TEX_P1_MAGFILT_SHIFT 7
|
||||
# define VC4_TEX_P1_MAGFILT_LINEAR 0
|
||||
# define VC4_TEX_P1_MAGFILT_NEAREST 1
|
||||
|
||||
#define VC4_TEX_P1_MINFILT_MASK VC4_MASK(6, 4)
|
||||
#define VC4_TEX_P1_MINFILT_SHIFT 4
|
||||
# define VC4_TEX_P1_MINFILT_LINEAR 0
|
||||
# define VC4_TEX_P1_MINFILT_NEAREST 1
|
||||
# define VC4_TEX_P1_MINFILT_NEAR_MIP_NEAR 2
|
||||
# define VC4_TEX_P1_MINFILT_NEAR_MIP_LIN 3
|
||||
# define VC4_TEX_P1_MINFILT_LIN_MIP_NEAR 4
|
||||
# define VC4_TEX_P1_MINFILT_LIN_MIP_LIN 5
|
||||
|
||||
#define VC4_TEX_P1_WRAP_T_MASK VC4_MASK(3, 2)
|
||||
#define VC4_TEX_P1_WRAP_T_SHIFT 2
|
||||
#define VC4_TEX_P1_WRAP_S_MASK VC4_MASK(1, 0)
|
||||
#define VC4_TEX_P1_WRAP_S_SHIFT 0
|
||||
# define VC4_TEX_P1_WRAP_REPEAT 0
|
||||
# define VC4_TEX_P1_WRAP_CLAMP 1
|
||||
# define VC4_TEX_P1_WRAP_MIRROR 2
|
||||
# define VC4_TEX_P1_WRAP_BORDER 3
|
||||
|
||||
#define VC4_TEX_P2_PTYPE_MASK VC4_MASK(31, 30)
|
||||
#define VC4_TEX_P2_PTYPE_SHIFT 30
|
||||
# define VC4_TEX_P2_PTYPE_IGNORED 0
|
||||
# define VC4_TEX_P2_PTYPE_CUBE_MAP_STRIDE 1
|
||||
# define VC4_TEX_P2_PTYPE_CHILD_IMAGE_DIMENSIONS 2
|
||||
# define VC4_TEX_P2_PTYPE_CHILD_IMAGE_OFFSETS 3
|
||||
|
||||
/* VC4_TEX_P2_PTYPE_CUBE_MAP_STRIDE bits */
|
||||
#define VC4_TEX_P2_CMST_MASK VC4_MASK(29, 12)
|
||||
#define VC4_TEX_P2_CMST_SHIFT 12
|
||||
#define VC4_TEX_P2_BSLOD_MASK VC4_MASK(0, 0)
|
||||
#define VC4_TEX_P2_BSLOD_SHIFT 0
|
||||
|
||||
/* VC4_TEX_P2_PTYPE_CHILD_IMAGE_DIMENSIONS */
|
||||
#define VC4_TEX_P2_CHEIGHT_MASK VC4_MASK(22, 12)
|
||||
#define VC4_TEX_P2_CHEIGHT_SHIFT 12
|
||||
#define VC4_TEX_P2_CWIDTH_MASK VC4_MASK(10, 0)
|
||||
#define VC4_TEX_P2_CWIDTH_SHIFT 0
|
||||
|
||||
/* VC4_TEX_P2_PTYPE_CHILD_IMAGE_OFFSETS */
|
||||
#define VC4_TEX_P2_CYOFF_MASK VC4_MASK(22, 12)
|
||||
#define VC4_TEX_P2_CYOFF_SHIFT 12
|
||||
#define VC4_TEX_P2_CXOFF_MASK VC4_MASK(10, 0)
|
||||
#define VC4_TEX_P2_CXOFF_SHIFT 0
|
||||
|
||||
#endif /* VC4_PACKET_H */
|
||||
|
|
|
|||
|
|
@ -1997,12 +1997,12 @@ write_texture_p0(struct vc4_context *vc4,
|
|||
struct pipe_sampler_view *texture = texstate->textures[unit];
|
||||
struct vc4_resource *rsc = vc4_resource(texture->texture);
|
||||
|
||||
bool is_cube = texture->target == PIPE_TEXTURE_CUBE;
|
||||
|
||||
cl_reloc(vc4, &vc4->uniforms, rsc->bo,
|
||||
rsc->slices[0].offset | texture->u.tex.last_level |
|
||||
is_cube << 9 |
|
||||
((rsc->vc4_format & 7) << 4));
|
||||
VC4_SET_FIELD(rsc->slices[0].offset >> 12, VC4_TEX_P0_OFFSET) |
|
||||
VC4_SET_FIELD(texture->u.tex.last_level, VC4_TEX_P0_MIPLVLS) |
|
||||
VC4_SET_FIELD(texture->target == PIPE_TEXTURE_CUBE,
|
||||
VC4_TEX_P0_CMMODE) |
|
||||
VC4_SET_FIELD(rsc->vc4_format & 7, VC4_TEX_P0_TYPE));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -2014,13 +2014,16 @@ write_texture_p1(struct vc4_context *vc4,
|
|||
struct vc4_resource *rsc = vc4_resource(texture->texture);
|
||||
struct pipe_sampler_state *sampler = texstate->samplers[unit];
|
||||
static const uint8_t minfilter_map[6] = {
|
||||
2, 4, /* mipfilter nearest */
|
||||
3, 5, /* mipfilter linear */
|
||||
1, 0, /* mipfilter none */
|
||||
VC4_TEX_P1_MINFILT_NEAR_MIP_NEAR,
|
||||
VC4_TEX_P1_MINFILT_LIN_MIP_NEAR,
|
||||
VC4_TEX_P1_MINFILT_NEAR_MIP_LIN,
|
||||
VC4_TEX_P1_MINFILT_LIN_MIP_LIN,
|
||||
VC4_TEX_P1_MINFILT_NEAREST,
|
||||
VC4_TEX_P1_MINFILT_LINEAR,
|
||||
};
|
||||
static const uint32_t magfilter_map[] = {
|
||||
[PIPE_TEX_FILTER_NEAREST] = 1,
|
||||
[PIPE_TEX_FILTER_LINEAR] = 0,
|
||||
[PIPE_TEX_FILTER_NEAREST] = VC4_TEX_P1_MAGFILT_NEAREST,
|
||||
[PIPE_TEX_FILTER_LINEAR] = VC4_TEX_P1_MAGFILT_LINEAR,
|
||||
};
|
||||
|
||||
bool either_nearest =
|
||||
|
|
@ -2028,14 +2031,20 @@ write_texture_p1(struct vc4_context *vc4,
|
|||
sampler->min_img_filter == PIPE_TEX_MIPFILTER_NEAREST);
|
||||
|
||||
cl_u32(&vc4->uniforms,
|
||||
((rsc->vc4_format >> 4) << 31) |
|
||||
(texture->texture->height0 << 20) |
|
||||
(texture->texture->width0 << 8) |
|
||||
(magfilter_map[sampler->mag_img_filter] << 7) |
|
||||
(minfilter_map[sampler->min_mip_filter * 2 +
|
||||
sampler->min_img_filter] << 4) |
|
||||
(translate_wrap(sampler->wrap_t, either_nearest) << 2) |
|
||||
(translate_wrap(sampler->wrap_s, either_nearest) << 0));
|
||||
VC4_SET_FIELD(rsc->vc4_format >> 4, VC4_TEX_P1_TYPE4) |
|
||||
VC4_SET_FIELD(texture->texture->height0 & 2047,
|
||||
VC4_TEX_P1_HEIGHT) |
|
||||
VC4_SET_FIELD(texture->texture->width0 & 2047,
|
||||
VC4_TEX_P1_WIDTH) |
|
||||
VC4_SET_FIELD(magfilter_map[sampler->mag_img_filter],
|
||||
VC4_TEX_P1_MAGFILT) |
|
||||
VC4_SET_FIELD(minfilter_map[sampler->min_mip_filter * 2 +
|
||||
sampler->min_img_filter],
|
||||
VC4_TEX_P1_MINFILT) |
|
||||
VC4_SET_FIELD(translate_wrap(sampler->wrap_s, either_nearest),
|
||||
VC4_TEX_P1_WRAP_S) |
|
||||
VC4_SET_FIELD(translate_wrap(sampler->wrap_t, either_nearest),
|
||||
VC4_TEX_P1_WRAP_T));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -2046,7 +2055,10 @@ write_texture_p2(struct vc4_context *vc4,
|
|||
struct pipe_sampler_view *texture = texstate->textures[unit];
|
||||
struct vc4_resource *rsc = vc4_resource(texture->texture);
|
||||
|
||||
cl_u32(&vc4->uniforms, (1 << 30) | rsc->cube_map_stride);
|
||||
cl_u32(&vc4->uniforms,
|
||||
VC4_SET_FIELD(VC4_TEX_P2_PTYPE_CUBE_MAP_STRIDE,
|
||||
VC4_TEX_P2_PTYPE) |
|
||||
VC4_SET_FIELD(rsc->cube_map_stride >> 12, VC4_TEX_P2_CMST));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue