[Mesa-dev] [PATCH 5/5] mesa: Implement a new GL_MESA_tile_raster_order extension.
Nicolai Hähnle
nhaehnle at gmail.com
Sat Oct 7 09:23:18 UTC 2017
Patches 1 & 2:
Acked-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
Patches 4 & 5:
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
(for the gallium parts; it would have been nice to split patch 4 up into
gallium and driver parts, but I won't insist)
On 05.10.2017 20:08, Eric Anholt wrote:
> The intent is to use this extension on vc4 to allow X11 to do overlapping
> CopyArea() within a pixmap without first blitting the pixmap to a
> temporary. With associated glamor patches, improves x11perf
> -copywinwin100 performance on a Raspberry Pi 3 from ~4700/sec to
> ~5130/sec, and is an even larger boost to uncomposited window movement
> performance (most copywinwin100 copies don't overlap).
>
> v2: Fix glIsEnabled() on the new enums.
> v3: Drop the local spec since I'm upstreaming the spec.
> ---
> docs/specs/enums.txt | 5 ++++
> include/GL/glext.h | 6 +++++
> src/mapi/glapi/gen/MESA_tile_raster_order.xml | 13 +++++++++
> src/mapi/glapi/gen/Makefile.am | 1 +
> src/mesa/main/context.c | 2 ++
> src/mesa/main/enable.c | 39 +++++++++++++++++++++++++++
> src/mesa/main/extensions_table.h | 1 +
> src/mesa/main/mtypes.h | 13 +++++++++
> src/mesa/state_tracker/st_atom_rasterizer.c | 5 ++++
> src/mesa/state_tracker/st_context.c | 1 +
> src/mesa/state_tracker/st_extensions.c | 1 +
> 11 files changed, 87 insertions(+)
> create mode 100644 src/mapi/glapi/gen/MESA_tile_raster_order.xml
>
> diff --git a/docs/specs/enums.txt b/docs/specs/enums.txt
> index 00d808483a43..4b0485f34901 100644
> --- a/docs/specs/enums.txt
> +++ b/docs/specs/enums.txt
> @@ -73,6 +73,11 @@ GL_MESA_program_debug
> GL_FRAGMENT_PROGRAM_CALLBACK_FUNC_MESA 0x8BB6
> GL_FRAGMENT_PROGRAM_CALLBACK_DATA_MESA 0x8BB7
>
> +GL_MESA_tile_raster_order
> + GL_TILE_RASTER_ORDER_FIXED_MESA 0x8BB8
> + GL_TILE_RASTER_ORDER_INCREASING_X_MESA 0x8BB9
> + GL_TILE_RASTER_ORDER_INCREASING_Y_MESA 0x8BBA
> +
> EGL_MESA_drm_image
> EGL_DRM_BUFFER_FORMAT_MESA 0x31D0
> EGL_DRM_BUFFER_USE_MESA 0x31D1
> diff --git a/include/GL/glext.h b/include/GL/glext.h
> index 613a8d4eca5f..7f47a3780c48 100644
> --- a/include/GL/glext.h
> +++ b/include/GL/glext.h
> @@ -12470,6 +12470,12 @@ GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (co
> #define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC
> #endif /* GL_WIN_specular_fog */
>
> +/* XXX: Get a regenerated header with the enums properly present. */
> +#define GL_TILE_RASTER_ORDER_FIXED_MESA 0x8BB8
> +#define GL_TILE_RASTER_ORDER_INCREASING_X_MESA 0x8BB9
> +#define GL_TILE_RASTER_ORDER_INCREASING_Y_MESA 0x8BBA
> +
> +
> #ifdef __cplusplus
> }
> #endif
> diff --git a/src/mapi/glapi/gen/MESA_tile_raster_order.xml b/src/mapi/glapi/gen/MESA_tile_raster_order.xml
> new file mode 100644
> index 000000000000..a1f0cb89bee4
> --- /dev/null
> +++ b/src/mapi/glapi/gen/MESA_tile_raster_order.xml
> @@ -0,0 +1,13 @@
> +<?xml version="1.0"?>
> +<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
> +
> +<OpenGLAPI>
> +
> +<!-- XXX: need an extension number -->
> +<category name="GL_MESA_tile_rasterizer_order">
> + <enum name="TILE_RASTER_ORDER_FIXED_MESA" value="0x8BB8"/>
> + <enum name="TILE_RASTER_ORDER_INCREASING_X_MESA" value="0x8BB9"/>
> + <enum name="TILE_RASTER_ORDER_INCREASING_Y_MESA" value="0x8BBA"/>
> +</category>
> +
> +</OpenGLAPI>
> diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am
> index 7f4a46930309..87d8517b7ba2 100644
> --- a/src/mapi/glapi/gen/Makefile.am
> +++ b/src/mapi/glapi/gen/Makefile.am
> @@ -210,6 +210,7 @@ API_XML = \
> KHR_robustness.xml \
> KHR_robustness_es.xml \
> KHR_texture_compression_astc.xml \
> + MESA_tile_raster_order.xml \
> NV_conditional_render.xml \
> NV_primitive_restart.xml \
> NV_texture_barrier.xml \
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 676103d47781..6d24b93c1926 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -867,6 +867,8 @@ init_attrib_groups(struct gl_context *ctx)
> return GL_FALSE;
>
> /* Miscellaneous */
> + ctx->TileRasterOrderIncreasingX = GL_TRUE;
> + ctx->TileRasterOrderIncreasingY = GL_TRUE;
> ctx->NewState = _NEW_ALL;
> ctx->NewDriverState = ~0;
> ctx->ErrorValue = GL_NO_ERROR;
> diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
> index 2e5fb009314d..8e99f2504f19 100644
> --- a/src/mesa/main/enable.c
> +++ b/src/mesa/main/enable.c
> @@ -1040,6 +1040,33 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
> }
> break;
>
> + case GL_TILE_RASTER_ORDER_FIXED_MESA:
> + CHECK_EXTENSION(MESA_tile_raster_order, cap);
> + if (ctx->TileRasterOrderFixed != state) {
> + FLUSH_VERTICES(ctx, 0);
> + ctx->NewDriverState |= ctx->DriverFlags.NewTileRasterOrder;
> + ctx->TileRasterOrderFixed = state;
> + }
> + break;
> +
> + case GL_TILE_RASTER_ORDER_INCREASING_X_MESA:
> + CHECK_EXTENSION(MESA_tile_raster_order, cap);
> + if (ctx->TileRasterOrderIncreasingX != state) {
> + FLUSH_VERTICES(ctx, 0);
> + ctx->NewDriverState |= ctx->DriverFlags.NewTileRasterOrder;
> + ctx->TileRasterOrderIncreasingX = state;
> + }
> + break;
> +
> + case GL_TILE_RASTER_ORDER_INCREASING_Y_MESA:
> + CHECK_EXTENSION(MESA_tile_raster_order, cap);
> + if (ctx->TileRasterOrderIncreasingY != state) {
> + FLUSH_VERTICES(ctx, 0);
> + ctx->NewDriverState |= ctx->DriverFlags.NewTileRasterOrder;
> + ctx->TileRasterOrderIncreasingY = state;
> + }
> + break;
> +
> /* GL 3.1 primitive restart. Note: this enum is different from
> * GL_PRIMITIVE_RESTART_NV (which is client state).
> */
> @@ -1716,6 +1743,18 @@ _mesa_IsEnabled( GLenum cap )
> CHECK_EXTENSION(INTEL_conservative_rasterization);
> return ctx->IntelConservativeRasterization;
>
> + case GL_TILE_RASTER_ORDER_FIXED_MESA:
> + CHECK_EXTENSION(MESA_tile_raster_order);
> + return ctx->TileRasterOrderFixed;
> +
> + case GL_TILE_RASTER_ORDER_INCREASING_X_MESA:
> + CHECK_EXTENSION(MESA_tile_raster_order);
> + return ctx->TileRasterOrderIncreasingX;
> +
> + case GL_TILE_RASTER_ORDER_INCREASING_Y_MESA:
> + CHECK_EXTENSION(MESA_tile_raster_order);
> + return ctx->TileRasterOrderIncreasingY;
> +
> default:
> goto invalid_enum_error;
> }
> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
> index 9475c1b69d94..724a593f6286 100644
> --- a/src/mesa/main/extensions_table.h
> +++ b/src/mesa/main/extensions_table.h
> @@ -314,6 +314,7 @@ EXT(KHR_texture_compression_astc_hdr , KHR_texture_compression_astc_hdr
> EXT(KHR_texture_compression_astc_ldr , KHR_texture_compression_astc_ldr , GLL, GLC, x , ES2, 2012)
> EXT(KHR_texture_compression_astc_sliced_3d , KHR_texture_compression_astc_sliced_3d , GLL, GLC, x , ES2, 2015)
>
> +EXT(MESA_tile_raster_order , MESA_tile_raster_order , GLL, GLC, x , ES2, 2017)
> EXT(MESA_pack_invert , MESA_pack_invert , GLL, GLC, x , x , 2002)
> EXT(MESA_shader_integer_functions , MESA_shader_integer_functions , GLL, GLC, x , 30, 2016)
> EXT(MESA_texture_signed_rgba , EXT_texture_snorm , GLL, GLC, x , x , 2009)
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index abda1a36e460..48b04dd47e7d 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -4185,6 +4185,7 @@ struct gl_extensions
> GLboolean KHR_texture_compression_astc_hdr;
> GLboolean KHR_texture_compression_astc_ldr;
> GLboolean KHR_texture_compression_astc_sliced_3d;
> + GLboolean MESA_tile_raster_order;
> GLboolean MESA_pack_invert;
> GLboolean MESA_shader_framebuffer_fetch;
> GLboolean MESA_shader_framebuffer_fetch_non_coherent;
> @@ -4436,6 +4437,9 @@ struct gl_driver_flags
> /** gl_context::RasterDiscard */
> uint64_t NewRasterizerDiscard;
>
> + /** gl_context::TileRasterOrder* */
> + uint64_t NewTileRasterOrder;
> +
> /**
> * gl_context::UniformBufferBindings
> * gl_shader_program::UniformBlocks
> @@ -4982,6 +4986,15 @@ struct gl_context
> /** Does glVertexAttrib(0) alias glVertex()? */
> bool _AttribZeroAliasesVertex;
>
> + /**
> + * When set, TileRasterOrderIncreasingX/Y control the order that a tiled
> + * renderer's tiles should be excecuted, to meet the requirements of
> + * GL_MESA_tile_raster_order.
> + */
> + GLboolean TileRasterOrderFixed;
> + GLboolean TileRasterOrderIncreasingX;
> + GLboolean TileRasterOrderIncreasingY;
> +
> /**
> * \name Hooks for module contexts.
> *
> diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c
> index 39be6b15a70e..4147340fd79a 100644
> --- a/src/mesa/state_tracker/st_atom_rasterizer.c
> +++ b/src/mesa/state_tracker/st_atom_rasterizer.c
> @@ -277,6 +277,11 @@ void st_update_rasterizer( struct st_context *st )
>
> /* ST_NEW_RASTERIZER */
> raster->rasterizer_discard = ctx->RasterDiscard;
> + if (ctx->TileRasterOrderFixed) {
> + raster->tile_raster_order_fixed = true;
> + raster->tile_raster_order_increasing_x = ctx->TileRasterOrderIncreasingX;
> + raster->tile_raster_order_increasing_y = ctx->TileRasterOrderIncreasingY;
> + }
>
> if (st->edgeflag_culls_prims) {
> /* All edge flags are FALSE. Cull the affected faces. */
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index 9610ad301464..69dd396a1cb8 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -489,6 +489,7 @@ static void st_init_driver_flags(struct st_context *st)
>
> f->NewArray = ST_NEW_VERTEX_ARRAYS;
> f->NewRasterizerDiscard = ST_NEW_RASTERIZER;
> + f->NewTileRasterOrder = ST_NEW_RASTERIZER;
> f->NewUniformBuffer = ST_NEW_UNIFORM_BUFFER;
> f->NewDefaultTessLevels = ST_NEW_TESS_STATE;
>
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index c3c7d6f9f8b6..d3ca297d24ff 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -651,6 +651,7 @@ void st_init_extensions(struct pipe_screen *screen,
> { o(AMD_seamless_cubemap_per_texture), PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE },
> { o(ATI_separate_stencil), PIPE_CAP_TWO_SIDED_STENCIL },
> { o(ATI_texture_mirror_once), PIPE_CAP_TEXTURE_MIRROR_CLAMP },
> + { o(MESA_tile_raster_order), PIPE_CAP_TILE_RASTER_ORDER },
> { o(NV_conditional_render), PIPE_CAP_CONDITIONAL_RENDER },
> { o(NV_fill_rectangle), PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE },
> { o(NV_primitive_restart), PIPE_CAP_PRIMITIVE_RESTART },
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list