mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
panfrost: Emit sampler descriptor on bifrost
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4680>
This commit is contained in:
parent
497977bbe6
commit
d3eb23adb5
4 changed files with 63 additions and 11 deletions
|
|
@ -483,6 +483,33 @@ void panfrost_sampler_desc_init(const struct pipe_sampler_state *cso,
|
||||||
hw->max_lod = hw->min_lod + 1;
|
hw->max_lod = hw->min_lod + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void panfrost_sampler_desc_init_bifrost(const struct pipe_sampler_state *cso,
|
||||||
|
struct bifrost_sampler_descriptor *hw)
|
||||||
|
{
|
||||||
|
*hw = (struct bifrost_sampler_descriptor) {
|
||||||
|
.unk1 = 0x1,
|
||||||
|
.wrap_s = translate_tex_wrap(cso->wrap_s),
|
||||||
|
.wrap_t = translate_tex_wrap(cso->wrap_t),
|
||||||
|
.wrap_r = translate_tex_wrap(cso->wrap_r),
|
||||||
|
.unk8 = 0x8,
|
||||||
|
.unk2 = 0x2,
|
||||||
|
.min_filter = cso->min_img_filter == PIPE_TEX_FILTER_NEAREST,
|
||||||
|
.norm_coords = cso->normalized_coords,
|
||||||
|
.mip_filter = cso->min_mip_filter == PIPE_TEX_MIPFILTER_LINEAR,
|
||||||
|
.mag_filter = cso->mag_img_filter == PIPE_TEX_FILTER_LINEAR,
|
||||||
|
.min_lod = FIXED_16(cso->min_lod, false), /* clamp at 0 */
|
||||||
|
.max_lod = FIXED_16(cso->max_lod, false),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* If necessary, we disable mipmapping in the sampler descriptor by
|
||||||
|
* clamping the LOD as tight as possible (from 0 to epsilon,
|
||||||
|
* essentially -- remember these are fixed point numbers, so
|
||||||
|
* epsilon=1/256) */
|
||||||
|
|
||||||
|
if (cso->min_mip_filter == PIPE_TEX_MIPFILTER_NONE)
|
||||||
|
hw->max_lod = hw->min_lod + 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
panfrost_make_stencil_state(const struct pipe_stencil_state *in,
|
panfrost_make_stencil_state(const struct pipe_stencil_state *in,
|
||||||
struct mali_stencil_test *out)
|
struct mali_stencil_test *out)
|
||||||
|
|
@ -1251,10 +1278,23 @@ panfrost_emit_sampler_descriptors(struct panfrost_batch *batch,
|
||||||
struct mali_vertex_tiler_postfix *postfix)
|
struct mali_vertex_tiler_postfix *postfix)
|
||||||
{
|
{
|
||||||
struct panfrost_context *ctx = batch->ctx;
|
struct panfrost_context *ctx = batch->ctx;
|
||||||
|
struct panfrost_device *device = pan_device(ctx->base.screen);
|
||||||
|
|
||||||
if (!ctx->sampler_count[stage])
|
if (!ctx->sampler_count[stage])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (device->quirks & IS_BIFROST) {
|
||||||
|
size_t desc_size = sizeof(struct bifrost_sampler_descriptor);
|
||||||
|
size_t transfer_size = desc_size * ctx->sampler_count[stage];
|
||||||
|
struct panfrost_transfer transfer = panfrost_allocate_transient(batch,
|
||||||
|
transfer_size);
|
||||||
|
struct bifrost_sampler_descriptor *desc = (struct bifrost_sampler_descriptor *)transfer.cpu;
|
||||||
|
|
||||||
|
for (int i = 0; i < ctx->sampler_count[stage]; ++i)
|
||||||
|
desc[i] = ctx->samplers[stage][i]->bifrost_hw;
|
||||||
|
|
||||||
|
postfix->sampler_descriptor = transfer.gpu;
|
||||||
|
} else {
|
||||||
size_t desc_size = sizeof(struct mali_sampler_descriptor);
|
size_t desc_size = sizeof(struct mali_sampler_descriptor);
|
||||||
size_t transfer_size = desc_size * ctx->sampler_count[stage];
|
size_t transfer_size = desc_size * ctx->sampler_count[stage];
|
||||||
struct panfrost_transfer transfer = panfrost_allocate_transient(batch,
|
struct panfrost_transfer transfer = panfrost_allocate_transient(batch,
|
||||||
|
|
@ -1262,10 +1302,11 @@ panfrost_emit_sampler_descriptors(struct panfrost_batch *batch,
|
||||||
struct mali_sampler_descriptor *desc = (struct mali_sampler_descriptor *)transfer.cpu;
|
struct mali_sampler_descriptor *desc = (struct mali_sampler_descriptor *)transfer.cpu;
|
||||||
|
|
||||||
for (int i = 0; i < ctx->sampler_count[stage]; ++i)
|
for (int i = 0; i < ctx->sampler_count[stage]; ++i)
|
||||||
desc[i] = ctx->samplers[stage][i]->hw;
|
desc[i] = ctx->samplers[stage][i]->midgard_hw;
|
||||||
|
|
||||||
postfix->sampler_descriptor = transfer.gpu;
|
postfix->sampler_descriptor = transfer.gpu;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
panfrost_emit_vertex_attr_meta(struct panfrost_batch *batch,
|
panfrost_emit_vertex_attr_meta(struct panfrost_batch *batch,
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,9 @@
|
||||||
void panfrost_sampler_desc_init(const struct pipe_sampler_state *cso,
|
void panfrost_sampler_desc_init(const struct pipe_sampler_state *cso,
|
||||||
struct mali_sampler_descriptor *hw);
|
struct mali_sampler_descriptor *hw);
|
||||||
|
|
||||||
|
void panfrost_sampler_desc_init_bifrost(const struct pipe_sampler_state *cso,
|
||||||
|
struct bifrost_sampler_descriptor *hw);
|
||||||
|
|
||||||
void
|
void
|
||||||
panfrost_vt_init(struct panfrost_context *ctx,
|
panfrost_vt_init(struct panfrost_context *ctx,
|
||||||
enum pipe_shader_type stage,
|
enum pipe_shader_type stage,
|
||||||
|
|
|
||||||
|
|
@ -592,9 +592,14 @@ panfrost_create_sampler_state(
|
||||||
const struct pipe_sampler_state *cso)
|
const struct pipe_sampler_state *cso)
|
||||||
{
|
{
|
||||||
struct panfrost_sampler_state *so = CALLOC_STRUCT(panfrost_sampler_state);
|
struct panfrost_sampler_state *so = CALLOC_STRUCT(panfrost_sampler_state);
|
||||||
|
struct panfrost_device *device = pan_device(pctx->screen);
|
||||||
|
|
||||||
so->base = *cso;
|
so->base = *cso;
|
||||||
|
|
||||||
panfrost_sampler_desc_init(cso, &so->hw);
|
if (device->quirks & IS_BIFROST)
|
||||||
|
panfrost_sampler_desc_init_bifrost(cso, &so->bifrost_hw);
|
||||||
|
else
|
||||||
|
panfrost_sampler_desc_init(cso, &so->midgard_hw);
|
||||||
|
|
||||||
return so;
|
return so;
|
||||||
}
|
}
|
||||||
|
|
@ -986,7 +991,9 @@ panfrost_sampler_view_destroy(
|
||||||
struct panfrost_sampler_view *view = (struct panfrost_sampler_view *) pview;
|
struct panfrost_sampler_view *view = (struct panfrost_sampler_view *) pview;
|
||||||
|
|
||||||
pipe_resource_reference(&pview->texture, NULL);
|
pipe_resource_reference(&pview->texture, NULL);
|
||||||
panfrost_bo_unreference(view->bo);
|
panfrost_bo_unreference(view->midgard_bo);
|
||||||
|
if (view->bifrost_descriptor)
|
||||||
|
ralloc_free(view->bifrost_descriptor);
|
||||||
ralloc_free(view);
|
ralloc_free(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -248,7 +248,8 @@ struct panfrost_vertex_state {
|
||||||
|
|
||||||
struct panfrost_sampler_state {
|
struct panfrost_sampler_state {
|
||||||
struct pipe_sampler_state base;
|
struct pipe_sampler_state base;
|
||||||
struct mali_sampler_descriptor hw;
|
struct mali_sampler_descriptor midgard_hw;
|
||||||
|
struct bifrost_sampler_descriptor bifrost_hw;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Misnomer: Sampler view corresponds to textures, not samplers */
|
/* Misnomer: Sampler view corresponds to textures, not samplers */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue