From e6764348564e2f865f382a81eae3ccfbf957d2fd Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 25 Jul 2017 16:13:57 -0700 Subject: [PATCH] mesa: Implement a new GL_MESA_tile_raster_order extension. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. Reviewed-by: Nicolai Hähnle --- 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 00d808483a4..4b0485f3490 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 613a8d4eca5..7f47a3780c4 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 00000000000..a1f0cb89bee --- /dev/null +++ b/src/mapi/glapi/gen/MESA_tile_raster_order.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am index 7f4a4693030..87d8517b7ba 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 676103d4778..6d24b93c192 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 2e5fb009314..8e99f2504f1 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 c1c39f9a16d..a8dab772341 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 455e7514ab9..ea62d0bfb71 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -4186,6 +4186,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; @@ -4437,6 +4438,9 @@ struct gl_driver_flags /** gl_context::RasterDiscard */ uint64_t NewRasterizerDiscard; + /** gl_context::TileRasterOrder* */ + uint64_t NewTileRasterOrder; + /** * gl_context::UniformBufferBindings * gl_shader_program::UniformBlocks @@ -4983,6 +4987,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 39be6b15a70..4147340fd79 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 9610ad30146..69dd396a1cb 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 1fbae9234e5..3dec5a87d73 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 }, -- 2.30.2