freedreno/a6xx: Use the fdl buffer view setup for img/ssbo descriptors.
The single-plane descriptor emit helper doesn't strictly need the UBWC reloc, since imageBuffer can't be UBWC, but it means the function is ready to be used for non-buffer image descriptors later. no-hw drawoverhead 1-imageBuffer change throughput 1.95457% +/- 1.44325% (n=127). Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13635>
This commit is contained in:
parent
3050e20283
commit
c356f3cfce
|
@ -432,7 +432,7 @@ fd6_emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
||||||
for (unsigned i = 0; i < mapping->num_tex; i++) {
|
for (unsigned i = 0; i < mapping->num_tex; i++) {
|
||||||
unsigned idx = mapping->tex_to_image[i];
|
unsigned idx = mapping->tex_to_image[i];
|
||||||
if (idx & IBO_SSBO) {
|
if (idx & IBO_SSBO) {
|
||||||
fd6_emit_ssbo_tex(state, &buf->sb[idx & ~IBO_SSBO]);
|
fd6_emit_ssbo_tex(ctx, state, &buf->sb[idx & ~IBO_SSBO]);
|
||||||
} else {
|
} else {
|
||||||
fd6_emit_image_tex(state, &img->si[idx]);
|
fd6_emit_image_tex(state, &img->si[idx]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,58 @@
|
||||||
#include "fd6_resource.h"
|
#include "fd6_resource.h"
|
||||||
#include "fd6_texture.h"
|
#include "fd6_texture.h"
|
||||||
|
|
||||||
|
static const uint8_t swiz_identity[4] = {PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y,
|
||||||
|
PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W};
|
||||||
|
|
||||||
|
static void
|
||||||
|
fd6_emit_single_plane_descriptor(struct fd_ringbuffer *ring,
|
||||||
|
struct pipe_resource *prsc,
|
||||||
|
uint32_t *descriptor)
|
||||||
|
{
|
||||||
|
/* If the resource isn't present (holes are allowed), zero-fill the slot. */
|
||||||
|
if (!prsc) {
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
OUT_RING(ring, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct fd_resource *rsc = fd_resource(prsc);
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
OUT_RING(ring, descriptor[i]);
|
||||||
|
|
||||||
|
OUT_RELOC(ring, rsc->bo, descriptor[4], (uint64_t)descriptor[5] << 32, 0);
|
||||||
|
|
||||||
|
OUT_RING(ring, descriptor[6]);
|
||||||
|
|
||||||
|
OUT_RELOC(ring, rsc->bo, descriptor[7], (uint64_t)descriptor[8] << 32, 0);
|
||||||
|
|
||||||
|
for (int i = 9; i < FDL6_TEX_CONST_DWORDS; i++)
|
||||||
|
OUT_RING(ring, descriptor[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fd6_ssbo_descriptor(struct fd_context *ctx,
|
||||||
|
const struct pipe_shader_buffer *buf, uint32_t *descriptor)
|
||||||
|
{
|
||||||
|
fdl6_buffer_view_init(
|
||||||
|
descriptor,
|
||||||
|
ctx->screen->info->a6xx.storage_16bit ? PIPE_FORMAT_R16_UINT
|
||||||
|
: PIPE_FORMAT_R32_UINT,
|
||||||
|
swiz_identity, buf->buffer_offset, /* Using relocs for addresses */
|
||||||
|
buf->buffer_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fd6_image_descriptor(struct fd_context *ctx, const struct pipe_image_view *buf,
|
||||||
|
uint32_t *descriptor)
|
||||||
|
{
|
||||||
|
assert(buf->resource->target == PIPE_BUFFER);
|
||||||
|
|
||||||
|
fdl6_buffer_view_init(descriptor, buf->format, swiz_identity,
|
||||||
|
buf->u.buf.offset, /* Using relocs for addresses */
|
||||||
|
buf->u.buf.size);
|
||||||
|
}
|
||||||
|
|
||||||
struct fd6_image {
|
struct fd6_image {
|
||||||
struct pipe_resource *prsc;
|
struct pipe_resource *prsc;
|
||||||
enum pipe_format pfmt;
|
enum pipe_format pfmt;
|
||||||
|
@ -132,45 +184,6 @@ translate_image(struct fd6_image *img, const struct pipe_image_view *pimg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
translate_buf(struct fd6_image *img, const struct pipe_shader_buffer *pimg)
|
|
||||||
{
|
|
||||||
struct pipe_resource *prsc = pimg->buffer;
|
|
||||||
struct fd_resource *rsc = fd_resource(prsc);
|
|
||||||
|
|
||||||
if (!prsc) {
|
|
||||||
memset(img, 0, sizeof(*img));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct fd_dev_info *dev_info = fd_screen(prsc->screen)->info;
|
|
||||||
enum pipe_format format = dev_info->a6xx.storage_16bit
|
|
||||||
? PIPE_FORMAT_R16_UINT
|
|
||||||
: PIPE_FORMAT_R32_UINT;
|
|
||||||
|
|
||||||
img->prsc = prsc;
|
|
||||||
img->pfmt = format;
|
|
||||||
img->type = fd6_tex_type(prsc->target);
|
|
||||||
img->srgb = util_format_is_srgb(format);
|
|
||||||
img->cpp = rsc->layout.cpp;
|
|
||||||
img->bo = rsc->bo;
|
|
||||||
img->buffer = true;
|
|
||||||
|
|
||||||
img->ubwc_offset = 0; /* not valid for buffers */
|
|
||||||
img->offset = pimg->buffer_offset;
|
|
||||||
img->pitch = 0;
|
|
||||||
img->array_pitch = 0;
|
|
||||||
img->level = 0;
|
|
||||||
|
|
||||||
/* size is encoded with low 15b in WIDTH and high bits in HEIGHT,
|
|
||||||
* in units of elements:
|
|
||||||
*/
|
|
||||||
unsigned sz = pimg->buffer_size / (dev_info->a6xx.storage_16bit ? 2 : 4);
|
|
||||||
img->width = sz & MASK(15);
|
|
||||||
img->height = sz >> 15;
|
|
||||||
img->depth = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_image_tex(struct fd_ringbuffer *ring, struct fd6_image *img)
|
emit_image_tex(struct fd_ringbuffer *ring, struct fd6_image *img)
|
||||||
{
|
{
|
||||||
|
@ -242,12 +255,12 @@ fd6_emit_image_tex(struct fd_ringbuffer *ring,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fd6_emit_ssbo_tex(struct fd_ringbuffer *ring,
|
fd6_emit_ssbo_tex(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
||||||
const struct pipe_shader_buffer *pbuf)
|
const struct pipe_shader_buffer *pbuf)
|
||||||
{
|
{
|
||||||
struct fd6_image img;
|
uint32_t descriptor[FDL6_TEX_CONST_DWORDS];
|
||||||
translate_buf(&img, pbuf);
|
fd6_ssbo_descriptor(ctx, pbuf, descriptor);
|
||||||
emit_image_tex(ring, &img);
|
fd6_emit_single_plane_descriptor(ring, pbuf->buffer, descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -266,7 +279,8 @@ emit_image_ssbo(struct fd_ringbuffer *ring, struct fd6_image *img)
|
||||||
enum a6xx_tile_mode tile_mode = fd_resource_tile_mode(img->prsc, img->level);
|
enum a6xx_tile_mode tile_mode = fd_resource_tile_mode(img->prsc, img->level);
|
||||||
bool ubwc_enabled = fd_resource_ubwc_enabled(rsc, img->level);
|
bool ubwc_enabled = fd_resource_ubwc_enabled(rsc, img->level);
|
||||||
|
|
||||||
OUT_RING(ring, A6XX_IBO_0_FMT(fd6_texture_format(img->pfmt, rsc->layout.tile_mode)) |
|
OUT_RING(ring, A6XX_IBO_0_FMT(
|
||||||
|
fd6_texture_format(img->pfmt, rsc->layout.tile_mode)) |
|
||||||
A6XX_IBO_0_TILE_MODE(tile_mode));
|
A6XX_IBO_0_TILE_MODE(tile_mode));
|
||||||
OUT_RING(ring,
|
OUT_RING(ring,
|
||||||
A6XX_IBO_1_WIDTH(img->width) | A6XX_IBO_1_HEIGHT(img->height));
|
A6XX_IBO_1_WIDTH(img->width) | A6XX_IBO_1_HEIGHT(img->height));
|
||||||
|
@ -320,17 +334,24 @@ fd6_build_ibo_state(struct fd_context *ctx, const struct ir3_shader_variant *v,
|
||||||
|
|
||||||
assert(shader == PIPE_SHADER_COMPUTE || shader == PIPE_SHADER_FRAGMENT);
|
assert(shader == PIPE_SHADER_COMPUTE || shader == PIPE_SHADER_FRAGMENT);
|
||||||
|
|
||||||
|
uint32_t descriptor[FDL6_TEX_CONST_DWORDS];
|
||||||
for (unsigned i = 0; i < v->shader->nir->info.num_ssbos; i++) {
|
for (unsigned i = 0; i < v->shader->nir->info.num_ssbos; i++) {
|
||||||
struct fd6_image img;
|
fd6_ssbo_descriptor(ctx, &bufso->sb[i], descriptor);
|
||||||
translate_buf(&img, &bufso->sb[i]);
|
fd6_emit_single_plane_descriptor(state, bufso->sb[i].buffer, descriptor);
|
||||||
emit_image_ssbo(state, &img);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned i = 0; i < v->shader->nir->info.num_images; i++) {
|
for (unsigned i = 0; i < v->shader->nir->info.num_images; i++) {
|
||||||
|
if (imgso->si[i].resource &&
|
||||||
|
imgso->si[i].resource->target == PIPE_BUFFER) {
|
||||||
|
fd6_image_descriptor(ctx, &imgso->si[i], descriptor);
|
||||||
|
fd6_emit_single_plane_descriptor(state, imgso->si[i].resource,
|
||||||
|
descriptor);
|
||||||
|
} else {
|
||||||
struct fd6_image img;
|
struct fd6_image img;
|
||||||
translate_image(&img, &imgso->si[i]);
|
translate_image(&img, &imgso->si[i]);
|
||||||
emit_image_ssbo(state, &img);
|
emit_image_ssbo(state, &img);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
void fd6_emit_image_tex(struct fd_ringbuffer *ring,
|
void fd6_emit_image_tex(struct fd_ringbuffer *ring,
|
||||||
const struct pipe_image_view *pimg) assert_dt;
|
const struct pipe_image_view *pimg) assert_dt;
|
||||||
void fd6_emit_ssbo_tex(struct fd_ringbuffer *ring,
|
void fd6_emit_ssbo_tex(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
||||||
const struct pipe_shader_buffer *pbuf) assert_dt;
|
const struct pipe_shader_buffer *pbuf) assert_dt;
|
||||||
|
|
||||||
struct ir3_shader_variant;
|
struct ir3_shader_variant;
|
||||||
|
|
Loading…
Reference in New Issue