Mesa (master): freedreno: Use the mesa/st frontend lowering of GL_CLAMP.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Feb 25 00:55:51 UTC 2021
Module: Mesa
Branch: master
Commit: c93fd1046ad7719ec7e65173254489625b7c8147
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c93fd1046ad7719ec7e65173254489625b7c8147
Author: Eric Anholt <eric at anholt.net>
Date: Fri Feb 19 16:23:06 2021 -0800
freedreno: Use the mesa/st frontend lowering of GL_CLAMP.
350 lines of code for this stupid feature, and we weren't even doing it
right for CS/GS/tess.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9267>
---
src/freedreno/ir3/ir3_nir.c | 23 -------
src/freedreno/ir3/ir3_shader.c | 6 --
src/freedreno/ir3/ir3_shader.h | 20 +-----
src/gallium/drivers/freedreno/a3xx/fd3_context.h | 13 ----
src/gallium/drivers/freedreno/a3xx/fd3_draw.c | 11 +---
src/gallium/drivers/freedreno/a3xx/fd3_texture.c | 79 ++----------------------
src/gallium/drivers/freedreno/a3xx/fd3_texture.h | 1 -
src/gallium/drivers/freedreno/a4xx/fd4_context.h | 13 ----
src/gallium/drivers/freedreno/a4xx/fd4_draw.c | 9 +--
src/gallium/drivers/freedreno/a4xx/fd4_texture.c | 78 ++---------------------
src/gallium/drivers/freedreno/a4xx/fd4_texture.h | 1 -
src/gallium/drivers/freedreno/a5xx/fd5_context.h | 13 ----
src/gallium/drivers/freedreno/a5xx/fd5_draw.c | 9 +--
src/gallium/drivers/freedreno/a5xx/fd5_texture.c | 79 ++----------------------
src/gallium/drivers/freedreno/a5xx/fd5_texture.h | 1 -
src/gallium/drivers/freedreno/a6xx/fd6_context.h | 13 ----
src/gallium/drivers/freedreno/a6xx/fd6_draw.c | 7 ---
src/gallium/drivers/freedreno/a6xx/fd6_texture.c | 79 ++----------------------
src/gallium/drivers/freedreno/a6xx/fd6_texture.h | 1 -
src/gallium/drivers/freedreno/freedreno_screen.c | 6 ++
src/gallium/drivers/freedreno/ir3/ir3_gallium.c | 4 +-
21 files changed, 32 insertions(+), 434 deletions(-)
diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c
index bb9908907a3..24d3902f541 100644
--- a/src/freedreno/ir3/ir3_nir.c
+++ b/src/freedreno/ir3/ir3_nir.c
@@ -479,29 +479,6 @@ ir3_nir_lower_variant(struct ir3_shader_variant *so, nir_shader *s)
progress |= OPT(s, ir3_nir_lower_view_layer_id, layer_zero, view_zero);
}
- struct nir_lower_tex_options tex_options = { };
-
- switch (so->shader->type) {
- case MESA_SHADER_FRAGMENT:
- tex_options.saturate_s = so->key.fsaturate_s;
- tex_options.saturate_t = so->key.fsaturate_t;
- tex_options.saturate_r = so->key.fsaturate_r;
- break;
- case MESA_SHADER_VERTEX:
- tex_options.saturate_s = so->key.vsaturate_s;
- tex_options.saturate_t = so->key.vsaturate_t;
- tex_options.saturate_r = so->key.vsaturate_r;
- break;
- default:
- /* TODO */
- break;
- }
-
- if (tex_options.saturate_s || tex_options.saturate_t ||
- tex_options.saturate_r) {
- progress |= OPT(s, nir_lower_tex, &tex_options);
- }
-
/* Move large constant variables to the constants attached to the NIR
* shader, which we will upload in the immediates range. This generates
* amuls, so we need to clean those up after.
diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c
index 30b94fadfa5..27f0966325c 100644
--- a/src/freedreno/ir3/ir3_shader.c
+++ b/src/freedreno/ir3/ir3_shader.c
@@ -428,9 +428,6 @@ ir3_setup_used_key(struct ir3_shader *shader)
key->ucp_enables = 0xff;
if (info->stage == MESA_SHADER_FRAGMENT) {
- key->fsaturate_s = ~0;
- key->fsaturate_t = ~0;
- key->fsaturate_r = ~0;
key->fastc_srgb = ~0;
key->fsamples = ~0;
@@ -455,9 +452,6 @@ ir3_setup_used_key(struct ir3_shader *shader)
key->has_gs = true;
if (info->stage == MESA_SHADER_VERTEX) {
- key->vsaturate_s = ~0;
- key->vsaturate_t = ~0;
- key->vsaturate_r = ~0;
key->vastc_srgb = ~0;
key->vsamples = ~0;
}
diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h
index 8ce5ae566e4..06d8e643e07 100644
--- a/src/freedreno/ir3/ir3_shader.h
+++ b/src/freedreno/ir3/ir3_shader.h
@@ -325,16 +325,6 @@ struct ir3_shader_key {
uint32_t global;
};
- /* bitmask of sampler which needs coords clamped for vertex
- * shader:
- */
- uint16_t vsaturate_s, vsaturate_t, vsaturate_r;
-
- /* bitmask of sampler which needs coords clamped for frag
- * shader:
- */
- uint16_t fsaturate_s, fsaturate_t, fsaturate_r;
-
/* bitmask of ms shifts */
uint32_t vsamples, fsamples;
@@ -371,10 +361,7 @@ static inline bool
ir3_shader_key_changes_fs(struct ir3_shader_key *key, struct ir3_shader_key *last_key)
{
if (last_key->has_per_samp || key->has_per_samp) {
- if ((last_key->fsaturate_s != key->fsaturate_s) ||
- (last_key->fsaturate_t != key->fsaturate_t) ||
- (last_key->fsaturate_r != key->fsaturate_r) ||
- (last_key->fsamples != key->fsamples) ||
+ if ((last_key->fsamples != key->fsamples) ||
(last_key->fastc_srgb != key->fastc_srgb))
return true;
}
@@ -399,10 +386,7 @@ static inline bool
ir3_shader_key_changes_vs(struct ir3_shader_key *key, struct ir3_shader_key *last_key)
{
if (last_key->has_per_samp || key->has_per_samp) {
- if ((last_key->vsaturate_s != key->vsaturate_s) ||
- (last_key->vsaturate_t != key->vsaturate_t) ||
- (last_key->vsaturate_r != key->vsaturate_r) ||
- (last_key->vsamples != key->vsamples) ||
+ if ((last_key->vsamples != key->vsamples) ||
(last_key->vastc_srgb != key->vastc_srgb))
return true;
}
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_context.h b/src/gallium/drivers/freedreno/a3xx/fd3_context.h
index 0c9412a7501..9000a64336e 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_context.h
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_context.h
@@ -47,19 +47,6 @@ struct fd3_context {
struct u_upload_mgr *border_color_uploader;
struct pipe_resource *border_color_buf;
- /* if *any* of bits are set in {v,f}saturate_{s,t,r} */
- bool vsaturate, fsaturate;
-
- /* bitmask of sampler which needs coords clamped for vertex
- * shader:
- */
- unsigned vsaturate_s, vsaturate_t, vsaturate_r;
-
- /* bitmask of sampler which needs coords clamped for frag
- * shader:
- */
- unsigned fsaturate_s, fsaturate_t, fsaturate_r;
-
/* some state changes require a different shader variant. Keep
* track of this so we know when we need to re-emit shader state
* due to variant change. See fixup_shader_state()
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
index 062cbe56abd..4f6d03187ca 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
@@ -121,7 +121,6 @@ fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
unsigned index_offset)
in_dt
{
- struct fd3_context *fd3_ctx = fd3_context(ctx);
struct fd3_emit emit = {
.debug = &ctx->debug,
.vtx = &ctx->vtx,
@@ -129,15 +128,7 @@ fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.info = info,
.indirect = indirect,
.draw = draw,
- .key = {
- .has_per_samp = (fd3_ctx->fsaturate || fd3_ctx->vsaturate),
- .vsaturate_s = fd3_ctx->vsaturate_s,
- .vsaturate_t = fd3_ctx->vsaturate_t,
- .vsaturate_r = fd3_ctx->vsaturate_r,
- .fsaturate_s = fd3_ctx->fsaturate_s,
- .fsaturate_t = fd3_ctx->fsaturate_t,
- .fsaturate_r = fd3_ctx->fsaturate_r,
- },
+ .key = { { { 0 } } },
.rasterflat = ctx->rasterizer->flatshade,
.sprite_coord_enable = ctx->rasterizer->sprite_coord_enable,
.sprite_coord_mode = ctx->rasterizer->sprite_coord_mode,
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_texture.c b/src/gallium/drivers/freedreno/a3xx/fd3_texture.c
index bea94bf0008..3518dacd24b 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_texture.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_texture.c
@@ -34,14 +34,8 @@
#include "fd3_format.h"
static enum a3xx_tex_clamp
-tex_clamp(unsigned wrap, bool clamp_to_edge, bool *needs_border)
+tex_clamp(unsigned wrap, bool *needs_border)
{
- /* Hardware does not support _CLAMP, but we emulate it: */
- if (wrap == PIPE_TEX_WRAP_CLAMP) {
- wrap = (clamp_to_edge) ?
- PIPE_TEX_WRAP_CLAMP_TO_EDGE : PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- }
-
switch (wrap) {
case PIPE_TEX_WRAP_REPEAT:
return A3XX_TEX_REPEAT;
@@ -87,7 +81,6 @@ fd3_sampler_state_create(struct pipe_context *pctx,
struct fd3_sampler_stateobj *so = CALLOC_STRUCT(fd3_sampler_stateobj);
unsigned aniso = util_last_bit(MIN2(cso->max_anisotropy >> 1, 8));
bool miplinear = false;
- bool clamp_to_edge;
if (!so)
return NULL;
@@ -97,21 +90,6 @@ fd3_sampler_state_create(struct pipe_context *pctx,
so->base = *cso;
- /*
- * For nearest filtering, _CLAMP means _CLAMP_TO_EDGE; for linear
- * filtering, _CLAMP means _CLAMP_TO_BORDER while additionally
- * clamping the texture coordinates to [0.0, 1.0].
- *
- * The clamping will be taken care of in the shaders. There are two
- * filters here, but let the minification one has a say.
- */
- clamp_to_edge = (cso->min_img_filter == PIPE_TEX_FILTER_NEAREST);
- if (!clamp_to_edge) {
- so->saturate_s = (cso->wrap_s == PIPE_TEX_WRAP_CLAMP);
- so->saturate_t = (cso->wrap_t == PIPE_TEX_WRAP_CLAMP);
- so->saturate_r = (cso->wrap_r == PIPE_TEX_WRAP_CLAMP);
- }
-
so->needs_border = false;
so->texsamp0 =
COND(!cso->normalized_coords, A3XX_TEX_SAMP_0_UNNORM_COORDS) |
@@ -120,9 +98,9 @@ fd3_sampler_state_create(struct pipe_context *pctx,
A3XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter, aniso)) |
A3XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter, aniso)) |
A3XX_TEX_SAMP_0_ANISO(aniso) |
- A3XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, clamp_to_edge, &so->needs_border)) |
- A3XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, clamp_to_edge, &so->needs_border)) |
- A3XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, clamp_to_edge, &so->needs_border));
+ A3XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, &so->needs_border)) |
+ A3XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, &so->needs_border)) |
+ A3XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, &so->needs_border));
if (cso->compare_mode)
so->texsamp0 |= A3XX_TEX_SAMP_0_COMPARE_FUNC(cso->compare_func); /* maps 1:1 */
@@ -146,53 +124,6 @@ fd3_sampler_state_create(struct pipe_context *pctx,
return so;
}
-static void
-fd3_sampler_states_bind(struct pipe_context *pctx,
- enum pipe_shader_type shader, unsigned start,
- unsigned nr, void **hwcso)
-{
- struct fd_context *ctx = fd_context(pctx);
- struct fd3_context *fd3_ctx = fd3_context(ctx);
- uint16_t saturate_s = 0, saturate_t = 0, saturate_r = 0;
- unsigned i;
-
- if (!hwcso)
- nr = 0;
-
- for (i = 0; i < nr; i++) {
- if (hwcso[i]) {
- struct fd3_sampler_stateobj *sampler =
- fd3_sampler_stateobj(hwcso[i]);
- if (sampler->saturate_s)
- saturate_s |= (1 << i);
- if (sampler->saturate_t)
- saturate_t |= (1 << i);
- if (sampler->saturate_r)
- saturate_r |= (1 << i);
- }
- }
-
- fd_sampler_states_bind(pctx, shader, start, nr, hwcso);
-
- if (shader == PIPE_SHADER_FRAGMENT) {
- fd3_ctx->fsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd3_ctx->fsaturate_s = saturate_s;
- fd3_ctx->fsaturate_t = saturate_t;
- fd3_ctx->fsaturate_r = saturate_r;
- } else if (shader == PIPE_SHADER_VERTEX) {
- fd3_ctx->vsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd3_ctx->vsaturate_s = saturate_s;
- fd3_ctx->vsaturate_t = saturate_t;
- fd3_ctx->vsaturate_r = saturate_r;
- }
-}
-
static enum a3xx_tex_type
tex_type(unsigned target)
{
@@ -291,7 +222,7 @@ void
fd3_texture_init(struct pipe_context *pctx)
{
pctx->create_sampler_state = fd3_sampler_state_create;
- pctx->bind_sampler_states = fd3_sampler_states_bind;
+ pctx->bind_sampler_states = fd_sampler_states_bind;
pctx->create_sampler_view = fd3_sampler_view_create;
pctx->set_sampler_views = fd_set_sampler_views;
}
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_texture.h b/src/gallium/drivers/freedreno/a3xx/fd3_texture.h
index f0f51381666..ddc4dfd65b4 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_texture.h
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_texture.h
@@ -38,7 +38,6 @@
struct fd3_sampler_stateobj {
struct pipe_sampler_state base;
uint32_t texsamp0, texsamp1;
- bool saturate_s, saturate_t, saturate_r;
bool needs_border;
};
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_context.h b/src/gallium/drivers/freedreno/a4xx/fd4_context.h
index a84e3a90f83..917e2778b1f 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_context.h
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_context.h
@@ -48,19 +48,6 @@ struct fd4_context {
struct u_upload_mgr *border_color_uploader;
struct pipe_resource *border_color_buf;
- /* if *any* of bits are set in {v,f}saturate_{s,t,r} */
- bool vsaturate, fsaturate;
-
- /* bitmask of sampler which needs coords clamped for vertex
- * shader:
- */
- uint16_t vsaturate_s, vsaturate_t, vsaturate_r;
-
- /* bitmask of sampler which needs coords clamped for frag
- * shader:
- */
- uint16_t fsaturate_s, fsaturate_t, fsaturate_r;
-
/* bitmask of samplers which need astc srgb workaround: */
uint16_t vastc_srgb, fastc_srgb;
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
index 021f1b6e61a..91d7beffd1b 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
@@ -116,14 +116,7 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.key = {
.rasterflat = ctx->rasterizer->flatshade,
.ucp_enables = ctx->rasterizer->clip_plane_enable,
- .has_per_samp = (fd4_ctx->fsaturate || fd4_ctx->vsaturate ||
- fd4_ctx->fastc_srgb || fd4_ctx->vastc_srgb),
- .vsaturate_s = fd4_ctx->vsaturate_s,
- .vsaturate_t = fd4_ctx->vsaturate_t,
- .vsaturate_r = fd4_ctx->vsaturate_r,
- .fsaturate_s = fd4_ctx->fsaturate_s,
- .fsaturate_t = fd4_ctx->fsaturate_t,
- .fsaturate_r = fd4_ctx->fsaturate_r,
+ .has_per_samp = fd4_ctx->fastc_srgb || fd4_ctx->vastc_srgb,
.vastc_srgb = fd4_ctx->vastc_srgb,
.fastc_srgb = fd4_ctx->fastc_srgb,
},
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_texture.c b/src/gallium/drivers/freedreno/a4xx/fd4_texture.c
index 16fbb463419..15f716ed5d6 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_texture.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_texture.c
@@ -34,14 +34,8 @@
#include "fd4_format.h"
static enum a4xx_tex_clamp
-tex_clamp(unsigned wrap, bool clamp_to_edge, bool *needs_border)
+tex_clamp(unsigned wrap, bool *needs_border)
{
- /* Hardware does not support _CLAMP, but we emulate it: */
- if (wrap == PIPE_TEX_WRAP_CLAMP) {
- wrap = (clamp_to_edge) ?
- PIPE_TEX_WRAP_CLAMP_TO_EDGE : PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- }
-
switch (wrap) {
case PIPE_TEX_WRAP_REPEAT:
return A4XX_TEX_REPEAT;
@@ -87,7 +81,6 @@ fd4_sampler_state_create(struct pipe_context *pctx,
struct fd4_sampler_stateobj *so = CALLOC_STRUCT(fd4_sampler_stateobj);
unsigned aniso = util_last_bit(MIN2(cso->max_anisotropy >> 1, 8));
bool miplinear = false;
- bool clamp_to_edge;
if (!so)
return NULL;
@@ -97,30 +90,15 @@ fd4_sampler_state_create(struct pipe_context *pctx,
so->base = *cso;
- /*
- * For nearest filtering, _CLAMP means _CLAMP_TO_EDGE; for linear
- * filtering, _CLAMP means _CLAMP_TO_BORDER while additionally
- * clamping the texture coordinates to [0.0, 1.0].
- *
- * The clamping will be taken care of in the shaders. There are two
- * filters here, but let the minification one has a say.
- */
- clamp_to_edge = (cso->min_img_filter == PIPE_TEX_FILTER_NEAREST);
- if (!clamp_to_edge) {
- so->saturate_s = (cso->wrap_s == PIPE_TEX_WRAP_CLAMP);
- so->saturate_t = (cso->wrap_t == PIPE_TEX_WRAP_CLAMP);
- so->saturate_r = (cso->wrap_r == PIPE_TEX_WRAP_CLAMP);
- }
-
so->needs_border = false;
so->texsamp0 =
COND(miplinear, A4XX_TEX_SAMP_0_MIPFILTER_LINEAR_NEAR) |
A4XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter, aniso)) |
A4XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter, aniso)) |
A4XX_TEX_SAMP_0_ANISO(aniso) |
- A4XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, clamp_to_edge, &so->needs_border)) |
- A4XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, clamp_to_edge, &so->needs_border)) |
- A4XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, clamp_to_edge, &so->needs_border));
+ A4XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, &so->needs_border)) |
+ A4XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, &so->needs_border)) |
+ A4XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, &so->needs_border));
so->texsamp1 =
// COND(miplinear, A4XX_TEX_SAMP_1_MIPFILTER_LINEAR_FAR) |
@@ -140,52 +118,6 @@ fd4_sampler_state_create(struct pipe_context *pctx,
return so;
}
-static void
-fd4_sampler_states_bind(struct pipe_context *pctx,
- enum pipe_shader_type shader, unsigned start,
- unsigned nr, void **hwcso)
-{
- struct fd_context *ctx = fd_context(pctx);
- struct fd4_context *fd4_ctx = fd4_context(ctx);
- uint16_t saturate_s = 0, saturate_t = 0, saturate_r = 0;
- unsigned i;
-
- if (!hwcso)
- nr = 0;
-
- for (i = 0; i < nr; i++) {
- if (hwcso[i]) {
- struct fd4_sampler_stateobj *sampler =
- fd4_sampler_stateobj(hwcso[i]);
- if (sampler->saturate_s)
- saturate_s |= (1 << i);
- if (sampler->saturate_t)
- saturate_t |= (1 << i);
- if (sampler->saturate_r)
- saturate_r |= (1 << i);
- }
- }
-
- fd_sampler_states_bind(pctx, shader, start, nr, hwcso);
-
- if (shader == PIPE_SHADER_FRAGMENT) {
- fd4_ctx->fsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd4_ctx->fsaturate_s = saturate_s;
- fd4_ctx->fsaturate_t = saturate_t;
- fd4_ctx->fsaturate_r = saturate_r;
- } else if (shader == PIPE_SHADER_VERTEX) {
- fd4_ctx->vsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd4_ctx->vsaturate_s = saturate_s;
- fd4_ctx->vsaturate_t = saturate_t;
- fd4_ctx->vsaturate_r = saturate_r;
- }
-}
static enum a4xx_tex_type
tex_type(unsigned target)
@@ -350,7 +282,7 @@ void
fd4_texture_init(struct pipe_context *pctx)
{
pctx->create_sampler_state = fd4_sampler_state_create;
- pctx->bind_sampler_states = fd4_sampler_states_bind;
+ pctx->bind_sampler_states = fd_sampler_states_bind;
pctx->create_sampler_view = fd4_sampler_view_create;
pctx->set_sampler_views = fd4_set_sampler_views;
}
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_texture.h b/src/gallium/drivers/freedreno/a4xx/fd4_texture.h
index 2e8861e4d78..42b5d2df33f 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_texture.h
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_texture.h
@@ -38,7 +38,6 @@
struct fd4_sampler_stateobj {
struct pipe_sampler_state base;
uint32_t texsamp0, texsamp1;
- bool saturate_s, saturate_t, saturate_r;
bool needs_border;
};
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_context.h b/src/gallium/drivers/freedreno/a5xx/fd5_context.h
index 466cb5cb3c0..4d96bc35873 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_context.h
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_context.h
@@ -51,19 +51,6 @@ struct fd5_context {
struct u_upload_mgr *border_color_uploader;
struct pipe_resource *border_color_buf;
- /* if *any* of bits are set in {v,f}saturate_{s,t,r} */
- bool vsaturate, fsaturate;
-
- /* bitmask of sampler which needs coords clamped for vertex
- * shader:
- */
- uint16_t vsaturate_s, vsaturate_t, vsaturate_r;
-
- /* bitmask of sampler which needs coords clamped for frag
- * shader:
- */
- uint16_t fsaturate_s, fsaturate_t, fsaturate_r;
-
/* bitmask of samplers which need astc srgb workaround: */
uint16_t vastc_srgb, fastc_srgb;
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
index 0f5ad2c2de6..a2bbf887495 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
@@ -111,14 +111,7 @@ fd5_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.key = {
.rasterflat = ctx->rasterizer->flatshade,
.ucp_enables = ctx->rasterizer->clip_plane_enable,
- .has_per_samp = (fd5_ctx->fsaturate || fd5_ctx->vsaturate ||
- fd5_ctx->fastc_srgb || fd5_ctx->vastc_srgb),
- .vsaturate_s = fd5_ctx->vsaturate_s,
- .vsaturate_t = fd5_ctx->vsaturate_t,
- .vsaturate_r = fd5_ctx->vsaturate_r,
- .fsaturate_s = fd5_ctx->fsaturate_s,
- .fsaturate_t = fd5_ctx->fsaturate_t,
- .fsaturate_r = fd5_ctx->fsaturate_r,
+ .has_per_samp = fd5_ctx->fastc_srgb || fd5_ctx->vastc_srgb,
.vastc_srgb = fd5_ctx->vastc_srgb,
.fastc_srgb = fd5_ctx->fastc_srgb,
.vsamples = ctx->tex[PIPE_SHADER_VERTEX].samples,
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_texture.c b/src/gallium/drivers/freedreno/a5xx/fd5_texture.c
index 370b9e9f931..0d6191d19dd 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_texture.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_texture.c
@@ -34,14 +34,8 @@
#include "fd5_format.h"
static enum a5xx_tex_clamp
-tex_clamp(unsigned wrap, bool clamp_to_edge, bool *needs_border)
+tex_clamp(unsigned wrap, bool *needs_border)
{
- /* Hardware does not support _CLAMP, but we emulate it: */
- if (wrap == PIPE_TEX_WRAP_CLAMP) {
- wrap = (clamp_to_edge) ?
- PIPE_TEX_WRAP_CLAMP_TO_EDGE : PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- }
-
switch (wrap) {
case PIPE_TEX_WRAP_REPEAT:
return A5XX_TEX_REPEAT;
@@ -87,7 +81,6 @@ fd5_sampler_state_create(struct pipe_context *pctx,
struct fd5_sampler_stateobj *so = CALLOC_STRUCT(fd5_sampler_stateobj);
unsigned aniso = util_last_bit(MIN2(cso->max_anisotropy >> 1, 8));
bool miplinear = false;
- bool clamp_to_edge;
if (!so)
return NULL;
@@ -97,30 +90,15 @@ fd5_sampler_state_create(struct pipe_context *pctx,
if (cso->min_mip_filter == PIPE_TEX_MIPFILTER_LINEAR)
miplinear = true;
- /*
- * For nearest filtering, _CLAMP means _CLAMP_TO_EDGE; for linear
- * filtering, _CLAMP means _CLAMP_TO_BORDER while additionally
- * clamping the texture coordinates to [0.0, 1.0].
- *
- * The clamping will be taken care of in the shaders. There are two
- * filters here, but let the minification one has a say.
- */
- clamp_to_edge = (cso->min_img_filter == PIPE_TEX_FILTER_NEAREST);
- if (!clamp_to_edge) {
- so->saturate_s = (cso->wrap_s == PIPE_TEX_WRAP_CLAMP);
- so->saturate_t = (cso->wrap_t == PIPE_TEX_WRAP_CLAMP);
- so->saturate_r = (cso->wrap_r == PIPE_TEX_WRAP_CLAMP);
- }
-
so->needs_border = false;
so->texsamp0 =
COND(miplinear, A5XX_TEX_SAMP_0_MIPFILTER_LINEAR_NEAR) |
A5XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter, aniso)) |
A5XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter, aniso)) |
A5XX_TEX_SAMP_0_ANISO(aniso) |
- A5XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, clamp_to_edge, &so->needs_border)) |
- A5XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, clamp_to_edge, &so->needs_border)) |
- A5XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, clamp_to_edge, &so->needs_border));
+ A5XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, &so->needs_border)) |
+ A5XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, &so->needs_border)) |
+ A5XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, &so->needs_border));
so->texsamp1 =
COND(!cso->seamless_cube_map, A5XX_TEX_SAMP_1_CUBEMAPSEAMLESSFILTOFF) |
@@ -148,53 +126,6 @@ fd5_sampler_state_create(struct pipe_context *pctx,
return so;
}
-static void
-fd5_sampler_states_bind(struct pipe_context *pctx,
- enum pipe_shader_type shader, unsigned start,
- unsigned nr, void **hwcso)
-{
- struct fd_context *ctx = fd_context(pctx);
- struct fd5_context *fd5_ctx = fd5_context(ctx);
- uint16_t saturate_s = 0, saturate_t = 0, saturate_r = 0;
- unsigned i;
-
- if (!hwcso)
- nr = 0;
-
- for (i = 0; i < nr; i++) {
- if (hwcso[i]) {
- struct fd5_sampler_stateobj *sampler =
- fd5_sampler_stateobj(hwcso[i]);
- if (sampler->saturate_s)
- saturate_s |= (1 << i);
- if (sampler->saturate_t)
- saturate_t |= (1 << i);
- if (sampler->saturate_r)
- saturate_r |= (1 << i);
- }
- }
-
- fd_sampler_states_bind(pctx, shader, start, nr, hwcso);
-
- if (shader == PIPE_SHADER_FRAGMENT) {
- fd5_ctx->fsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd5_ctx->fsaturate_s = saturate_s;
- fd5_ctx->fsaturate_t = saturate_t;
- fd5_ctx->fsaturate_r = saturate_r;
- } else if (shader == PIPE_SHADER_VERTEX) {
- fd5_ctx->vsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd5_ctx->vsaturate_s = saturate_s;
- fd5_ctx->vsaturate_t = saturate_t;
- fd5_ctx->vsaturate_r = saturate_r;
- }
-}
-
static bool
use_astc_srgb_workaround(struct pipe_context *pctx, enum pipe_format format)
{
@@ -349,7 +280,7 @@ void
fd5_texture_init(struct pipe_context *pctx)
{
pctx->create_sampler_state = fd5_sampler_state_create;
- pctx->bind_sampler_states = fd5_sampler_states_bind;
+ pctx->bind_sampler_states = fd_sampler_states_bind;
pctx->create_sampler_view = fd5_sampler_view_create;
pctx->set_sampler_views = fd5_set_sampler_views;
}
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_texture.h b/src/gallium/drivers/freedreno/a5xx/fd5_texture.h
index 5cb201dfdf7..b45c526dfce 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_texture.h
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_texture.h
@@ -38,7 +38,6 @@
struct fd5_sampler_stateobj {
struct pipe_sampler_state base;
uint32_t texsamp0, texsamp1, texsamp2, texsamp3;
- bool saturate_s, saturate_t, saturate_r;
bool needs_border;
};
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.h b/src/gallium/drivers/freedreno/a6xx/fd6_context.h
index ae1b4283c07..d8552f31c55 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_context.h
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.h
@@ -70,19 +70,6 @@ struct fd6_context {
struct u_upload_mgr *border_color_uploader;
struct pipe_resource *border_color_buf;
- /* if *any* of bits are set in {v,f}saturate_{s,t,r} */
- bool vsaturate, fsaturate;
-
- /* bitmask of sampler which needs coords clamped for vertex
- * shader:
- */
- uint16_t vsaturate_s, vsaturate_t, vsaturate_r;
-
- /* bitmask of sampler which needs coords clamped for frag
- * shader:
- */
- uint16_t fsaturate_s, fsaturate_t, fsaturate_r;
-
/* some state changes require a different shader variant. Keep
* track of this so we know when we need to re-emit shader state
* due to variant change. See fixup_shader_state()
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
index 83e76af88be..c7af50aa4e5 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
@@ -188,13 +188,6 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.key = {
.rasterflat = ctx->rasterizer->flatshade,
.ucp_enables = ctx->rasterizer->clip_plane_enable,
- .has_per_samp = (fd6_ctx->fsaturate || fd6_ctx->vsaturate),
- .vsaturate_s = fd6_ctx->vsaturate_s,
- .vsaturate_t = fd6_ctx->vsaturate_t,
- .vsaturate_r = fd6_ctx->vsaturate_r,
- .fsaturate_s = fd6_ctx->fsaturate_s,
- .fsaturate_t = fd6_ctx->fsaturate_t,
- .fsaturate_r = fd6_ctx->fsaturate_r,
.layer_zero = !gs_info || !(gs_info->outputs_written & VARYING_BIT_LAYER),
.vsamples = ctx->tex[PIPE_SHADER_VERTEX].samples,
.fsamples = ctx->tex[PIPE_SHADER_FRAGMENT].samples,
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_texture.c b/src/gallium/drivers/freedreno/a6xx/fd6_texture.c
index 10462e852cd..56d25ce9a0d 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_texture.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_texture.c
@@ -46,14 +46,8 @@ remove_tex_entry(struct fd6_context *fd6_ctx, struct hash_entry *entry)
}
static enum a6xx_tex_clamp
-tex_clamp(unsigned wrap, bool clamp_to_edge, bool *needs_border)
+tex_clamp(unsigned wrap, bool *needs_border)
{
- /* Hardware does not support _CLAMP, but we emulate it: */
- if (wrap == PIPE_TEX_WRAP_CLAMP) {
- wrap = (clamp_to_edge) ?
- PIPE_TEX_WRAP_CLAMP_TO_EDGE : PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- }
-
switch (wrap) {
case PIPE_TEX_WRAP_REPEAT:
return A6XX_TEX_REPEAT;
@@ -99,7 +93,6 @@ fd6_sampler_state_create(struct pipe_context *pctx,
struct fd6_sampler_stateobj *so = CALLOC_STRUCT(fd6_sampler_stateobj);
unsigned aniso = util_last_bit(MIN2(cso->max_anisotropy >> 1, 8));
bool miplinear = false;
- bool clamp_to_edge;
if (!so)
return NULL;
@@ -110,30 +103,15 @@ fd6_sampler_state_create(struct pipe_context *pctx,
if (cso->min_mip_filter == PIPE_TEX_MIPFILTER_LINEAR)
miplinear = true;
- /*
- * For nearest filtering, _CLAMP means _CLAMP_TO_EDGE; for linear
- * filtering, _CLAMP means _CLAMP_TO_BORDER while additionally
- * clamping the texture coordinates to [0.0, 1.0].
- *
- * The clamping will be taken care of in the shaders. There are two
- * filters here, but let the minification one has a say.
- */
- clamp_to_edge = (cso->min_img_filter == PIPE_TEX_FILTER_NEAREST);
- if (!clamp_to_edge) {
- so->saturate_s = (cso->wrap_s == PIPE_TEX_WRAP_CLAMP);
- so->saturate_t = (cso->wrap_t == PIPE_TEX_WRAP_CLAMP);
- so->saturate_r = (cso->wrap_r == PIPE_TEX_WRAP_CLAMP);
- }
-
so->needs_border = false;
so->texsamp0 =
COND(miplinear, A6XX_TEX_SAMP_0_MIPFILTER_LINEAR_NEAR) |
A6XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter, aniso)) |
A6XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter, aniso)) |
A6XX_TEX_SAMP_0_ANISO(aniso) |
- A6XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, clamp_to_edge, &so->needs_border)) |
- A6XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, clamp_to_edge, &so->needs_border)) |
- A6XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, clamp_to_edge, &so->needs_border));
+ A6XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, &so->needs_border)) |
+ A6XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, &so->needs_border)) |
+ A6XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, &so->needs_border));
so->texsamp1 =
COND(cso->min_mip_filter == PIPE_TEX_MIPFILTER_NONE,
@@ -177,53 +155,6 @@ fd6_sampler_state_delete(struct pipe_context *pctx, void *hwcso)
free(hwcso);
}
-static void
-fd6_sampler_states_bind(struct pipe_context *pctx,
- enum pipe_shader_type shader, unsigned start,
- unsigned nr, void **hwcso)
-{
- struct fd_context *ctx = fd_context(pctx);
- struct fd6_context *fd6_ctx = fd6_context(ctx);
- uint16_t saturate_s = 0, saturate_t = 0, saturate_r = 0;
- unsigned i;
-
- if (!hwcso)
- nr = 0;
-
- for (i = 0; i < nr; i++) {
- if (hwcso[i]) {
- struct fd6_sampler_stateobj *sampler =
- fd6_sampler_stateobj(hwcso[i]);
- if (sampler->saturate_s)
- saturate_s |= (1 << i);
- if (sampler->saturate_t)
- saturate_t |= (1 << i);
- if (sampler->saturate_r)
- saturate_r |= (1 << i);
- }
- }
-
- fd_sampler_states_bind(pctx, shader, start, nr, hwcso);
-
- if (shader == PIPE_SHADER_FRAGMENT) {
- fd6_ctx->fsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd6_ctx->fsaturate_s = saturate_s;
- fd6_ctx->fsaturate_t = saturate_t;
- fd6_ctx->fsaturate_r = saturate_r;
- } else if (shader == PIPE_SHADER_VERTEX) {
- fd6_ctx->vsaturate =
- (saturate_s != 0) ||
- (saturate_t != 0) ||
- (saturate_r != 0);
- fd6_ctx->vsaturate_s = saturate_s;
- fd6_ctx->vsaturate_t = saturate_t;
- fd6_ctx->vsaturate_r = saturate_r;
- }
-}
-
static struct pipe_sampler_view *
fd6_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
const struct pipe_sampler_view *cso)
@@ -528,7 +459,7 @@ fd6_texture_init(struct pipe_context *pctx)
pctx->create_sampler_state = fd6_sampler_state_create;
pctx->delete_sampler_state = fd6_sampler_state_delete;
- pctx->bind_sampler_states = fd6_sampler_states_bind;
+ pctx->bind_sampler_states = fd_sampler_states_bind;
pctx->create_sampler_view = fd6_sampler_view_create;
pctx->sampler_view_destroy = fd6_sampler_view_destroy;
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_texture.h b/src/gallium/drivers/freedreno/a6xx/fd6_texture.h
index 0e900d292a7..3ce43d5633b 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_texture.h
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_texture.h
@@ -39,7 +39,6 @@
struct fd6_sampler_stateobj {
struct pipe_sampler_state base;
uint32_t texsamp0, texsamp1, texsamp2, texsamp3;
- bool saturate_s, saturate_t, saturate_r;
bool needs_border;
uint16_t seqno;
};
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index 30369501f56..133e774791b 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -398,6 +398,12 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_MAX_GS_INVOCATIONS:
return 32;
+ /* Only a2xx has the half-border clamp mode in HW, just have mesa/st lower
+ * it for later HW.
+ */
+ case PIPE_CAP_GL_CLAMP:
+ return is_a2xx(screen);
+
/* Stream output. */
case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
if (is_ir3(screen))
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c
index 65d5846eb84..8926f7bca9b 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c
@@ -142,11 +142,9 @@ ir3_shader_variant(struct ir3_shader *shader, struct ir3_shader_key key,
if (created) {
if (shader->initial_variants_done) {
pipe_debug_message(debug, SHADER_INFO,
- "%s shader: recompiling at draw time: global 0x%08x, vsats %x/%x/%x, fsats %x/%x/%x, vfsamples %x/%x, astc %x/%x\n",
+ "%s shader: recompiling at draw time: global 0x%08x, vfsamples %x/%x, astc %x/%x\n",
ir3_shader_stage(v),
key.global,
- key.vsaturate_s, key.vsaturate_t, key.vsaturate_r,
- key.fsaturate_s, key.fsaturate_t, key.fsaturate_r,
key.vsamples, key.fsamples,
key.vastc_srgb, key.fastc_srgb);
More information about the mesa-commit
mailing list