summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>2020-07-15 21:23:48 +0200
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>2020-09-02 11:53:16 +0200
commitd94bec5c49d926069f97a4b12fb2532611a9080c (patch)
tree2dfd1956a9a1ef0c1630e2cb11ac5f89119b2f51
parent54fed1cf95ea8cbbdc18c6c82e8f766444a12ac3 (diff)
mesa/st: introduce PIPE_CAP_NO_CLIP_ON_COPY_TEX
If supported this means that src_x/src_y/width/height parameters of CopyTex functions will not be clipped using the read framebuffer's dimensions. Cc: mesa-stable Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6259>
-rw-r--r--docs/gallium/screen.rst1
-rw-r--r--src/gallium/auxiliary/util/u_screen.c3
-rw-r--r--src/gallium/include/pipe/p_defines.h1
-rw-r--r--src/mesa/main/mtypes.h6
-rw-r--r--src/mesa/main/teximage.c6
-rw-r--r--src/mesa/state_tracker/st_context.c4
6 files changed, 19 insertions, 2 deletions
diff --git a/docs/gallium/screen.rst b/docs/gallium/screen.rst
index 45c82802cc9..8ae3de036f7 100644
--- a/docs/gallium/screen.rst
+++ b/docs/gallium/screen.rst
@@ -590,6 +590,7 @@ The integer capabilities:
* ``PIPE_CAP_GLSL_ZERO_INIT``: Choose a default zero initialization some glsl variables. If `1`, then all glsl shader variables and gl_FragColor are initialized to zero. If `2`, then shader out variables are not initialized but function out variables are.
* ``PIPE_CAP_BLEND_EQUATION_ADVANCED``: Driver supports blend equation advanced without necessarily supporting FBFETCH.
* ``PIPE_CAP_NIR_ATOMICS_AS_DEREF``: Whether NIR atomics instructions should reference atomics as NIR derefs instead of by indices.
+* ``PIPE_CAP_NO_CLIP_ON_COPY_TEX``: Driver doesn't want x/y/width/height clipped based on src size when doing a copy texture operation (eg: may want out-of-bounds reads that produce 0 instead of leaving the texture content undefined)
.. _pipe_capf:
diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c
index 9f174c58701..cb06acfba77 100644
--- a/src/gallium/auxiliary/util/u_screen.c
+++ b/src/gallium/auxiliary/util/u_screen.c
@@ -438,6 +438,9 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
case PIPE_CAP_ALPHA_TO_COVERAGE_DITHER_CONTROL:
return 0;
+ case PIPE_CAP_NO_CLIP_ON_COPY_TEX:
+ return 0;
+
default:
unreachable("bad PIPE_CAP_*");
}
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index 235c8ec06bc..7eb7c703ffe 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -966,6 +966,7 @@ enum pipe_cap
PIPE_CAP_GLSL_ZERO_INIT,
PIPE_CAP_BLEND_EQUATION_ADVANCED,
PIPE_CAP_NIR_ATOMICS_AS_DEREF,
+ PIPE_CAP_NO_CLIP_ON_COPY_TEX,
};
/**
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 8924f5d4f85..f9353d9ef95 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -4209,6 +4209,12 @@ struct gl_constants
/** Buffer size used to upload vertices from glBegin/glEnd. */
unsigned glBeginEndBufferSize;
+
+ /** Whether the driver doesn't want x/y/width/height clipped based on src size
+ * when doing a copy texture operation (eg: may want out-of-bounds reads that
+ * produce 0 instead of leaving the texture content undefined).
+ */
+ bool NoClippingOnCopyTex;
};
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 7a74ff25106..895b5664e5b 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -4210,7 +4210,8 @@ copy_texture_sub_image(struct gl_context *ctx, GLuint dims,
xoffset += texImage->Border;
}
- if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y,
+ if (ctx->Const.NoClippingOnCopyTex ||
+ _mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y,
&width, &height)) {
struct gl_renderbuffer *srcRb =
get_copy_tex_image_source(ctx, texImage->TexFormat);
@@ -4416,7 +4417,8 @@ copyteximage(struct gl_context *ctx, GLuint dims, struct gl_texture_object *texO
/* Allocate texture memory (no pixel data yet) */
ctx->Driver.AllocTextureImageBuffer(ctx, texImage);
- if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY,
+ if (ctx->Const.NoClippingOnCopyTex ||
+ _mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY,
&width, &height)) {
struct gl_renderbuffer *srcRb =
get_copy_tex_image_source(ctx, texImage->TexFormat);
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 6c8ba9dd732..aaaa615e09b 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -762,6 +762,10 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
*/
ctx->Point.MaxSize = MAX2(ctx->Const.MaxPointSize,
ctx->Const.MaxPointSizeAA);
+
+ ctx->Const.NoClippingOnCopyTex = screen->get_param(screen,
+ PIPE_CAP_NO_CLIP_ON_COPY_TEX);
+
/* For vertex shaders, make sure not to emit saturate when SM 3.0
* is not supported
*/