From d94bec5c49d926069f97a4b12fb2532611a9080c Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 15 Jul 2020 21:23:48 +0200 Subject: [PATCH] mesa/st: introduce PIPE_CAP_NO_CLIP_ON_COPY_TEX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Part-of: --- docs/gallium/screen.rst | 1 + src/gallium/auxiliary/util/u_screen.c | 3 +++ src/gallium/include/pipe/p_defines.h | 1 + src/mesa/main/mtypes.h | 6 ++++++ src/mesa/main/teximage.c | 6 ++++-- src/mesa/state_tracker/st_context.c | 4 ++++ 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 */