From e7a091936fb6fd578c6ced9baa38b306b638a11b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 9 Jun 2017 21:42:12 +0200 Subject: [PATCH] mesa: replace ctx->Polygon._FrontBit with a helper function MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle Reviewed-by: Brian Paul Reviewed-by: Timothy Arceri --- src/mesa/drivers/dri/i915/intel_tris.c | 1 + src/mesa/drivers/dri/i965/brw_clip.c | 2 +- src/mesa/drivers/dri/i965/brw_context.c | 4 + src/mesa/drivers/dri/i965/brw_context.h | 2 + src/mesa/drivers/dri/i965/brw_sf.c | 2 +- src/mesa/drivers/dri/i965/brw_sf_state.c | 200 ++++++++++++++++++ src/mesa/drivers/dri/i965/genX_state_upload.c | 6 +- src/mesa/drivers/dri/r200/r200_swtcl.c | 1 + src/mesa/drivers/dri/radeon/radeon_swtcl.c | 1 + src/mesa/main/mtypes.h | 1 - src/mesa/main/polygon.c | 1 - src/mesa/main/state.c | 18 -- src/mesa/main/state.h | 10 + src/mesa/swrast_setup/ss_triangle.c | 1 + src/mesa/swrast_setup/ss_tritmp.h | 2 +- src/mesa/tnl_dd/t_dd_tritmp.h | 4 +- 16 files changed, 228 insertions(+), 28 deletions(-) create mode 100644 src/mesa/drivers/dri/i965/brw_sf_state.c diff --git a/src/mesa/drivers/dri/i915/intel_tris.c b/src/mesa/drivers/dri/i915/intel_tris.c index 36cba22780b..70e4fa308c6 100644 --- a/src/mesa/drivers/dri/i915/intel_tris.c +++ b/src/mesa/drivers/dri/i915/intel_tris.c @@ -39,6 +39,7 @@ #include "main/state.h" #include "main/dd.h" #include "main/fbobject.h" +#include "main/state.h" #include "swrast/swrast.h" #include "swrast_setup/swrast_setup.h" diff --git a/src/mesa/drivers/dri/i965/brw_clip.c b/src/mesa/drivers/dri/i965/brw_clip.c index d8805ff4fa5..e3023e50e9c 100644 --- a/src/mesa/drivers/dri/i965/brw_clip.c +++ b/src/mesa/drivers/dri/i965/brw_clip.c @@ -181,7 +181,7 @@ brw_upload_clip_prog(struct brw_context *brw) key.offset_clamp = ctx->Polygon.OffsetClamp * ctx->DrawBuffer->_MRD; } - if (!ctx->Polygon._FrontBit) { + if (!brw->polygon_front_bit) { key.fill_ccw = fill_front; key.fill_cw = fill_back; key.offset_ccw = offset_front; diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index ec87817c517..e9de5b7b238 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -44,6 +44,7 @@ #include "main/texobj.h" #include "main/framebuffer.h" #include "main/stencil.h" +#include "main/state.h" #include "vbo/vbo_context.h" @@ -209,6 +210,9 @@ intel_update_state(struct gl_context * ctx) _mesa_stencil_is_write_enabled(ctx, brw->stencil_two_sided); } + if (new_state & _NEW_POLYGON) + brw->polygon_front_bit = _mesa_polygon_get_front_bit(ctx); + intel_prepare_render(brw); /* Resolve the depth buffer's HiZ buffer. */ diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 2eea3030115..0e300c6c2a1 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -778,6 +778,8 @@ struct brw_context bool stencil_enabled; bool stencil_two_sided; bool stencil_write_enabled; + /** Derived polygon state. */ + bool polygon_front_bit; /**< 0=GL_CCW, 1=GL_CW */ struct isl_device isl_dev; diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c index d92b5197fdd..1d5023258a7 100644 --- a/src/mesa/drivers/dri/i965/brw_sf.c +++ b/src/mesa/drivers/dri/i965/brw_sf.c @@ -161,7 +161,7 @@ brw_upload_sf_prog(struct brw_context *brw) * face orientation, just as we invert the viewport in * sf_unit_create_from_key(). */ - key.frontface_ccw = ctx->Polygon._FrontBit == render_to_fbo; + key.frontface_ccw = brw->polygon_front_bit == render_to_fbo; } if (!brw_search_cache(&brw->cache, BRW_CACHE_SF_PROG, diff --git a/src/mesa/drivers/dri/i965/brw_sf_state.c b/src/mesa/drivers/dri/i965/brw_sf_state.c new file mode 100644 index 00000000000..c739201f7b7 --- /dev/null +++ b/src/mesa/drivers/dri/i965/brw_sf_state.c @@ -0,0 +1,200 @@ +/* + Copyright (C) Intel Corp. 2006. All Rights Reserved. + Intel funded Tungsten Graphics to + develop this 3D driver. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice (including the + next paragraph) shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + **********************************************************************/ + /* + * Authors: + * Keith Whitwell + */ + + + +#include "main/mtypes.h" +#include "main/macros.h" +#include "main/fbobject.h" +#include "main/viewport.h" +#include "intel_batchbuffer.h" +#include "brw_context.h" +#include "brw_state.h" +#include "brw_defines.h" +#include "brw_util.h" + +static void upload_sf_unit( struct brw_context *brw ) +{ + struct gl_context *ctx = &brw->ctx; + struct brw_sf_unit_state *sf; + int chipset_max_threads; + bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); + + sf = brw_state_batch(brw, sizeof(*sf), 64, &brw->sf.state_offset); + + memset(sf, 0, sizeof(*sf)); + + /* BRW_NEW_PROGRAM_CACHE | BRW_NEW_SF_PROG_DATA */ + sf->thread0.grf_reg_count = ALIGN(brw->sf.prog_data->total_grf, 16) / 16 - 1; + sf->thread0.kernel_start_pointer = + brw_program_reloc(brw, + brw->sf.state_offset + + offsetof(struct brw_sf_unit_state, thread0), + brw->sf.prog_offset + + (sf->thread0.grf_reg_count << 1)) >> 6; + + sf->thread1.floating_point_mode = BRW_FLOATING_POINT_NON_IEEE_754; + + sf->thread3.dispatch_grf_start_reg = 3; + sf->thread3.urb_entry_read_offset = BRW_SF_URB_ENTRY_READ_OFFSET; + + /* BRW_NEW_SF_PROG_DATA */ + sf->thread3.urb_entry_read_length = brw->sf.prog_data->urb_read_length; + + /* BRW_NEW_URB_FENCE */ + sf->thread4.nr_urb_entries = brw->urb.nr_sf_entries; + sf->thread4.urb_entry_allocation_size = brw->urb.sfsize - 1; + + /* Each SF thread produces 1 PUE, and there can be up to 24 (Pre-Ironlake) or + * 48 (Ironlake) threads. + */ + if (brw->gen == 5) + chipset_max_threads = 48; + else + chipset_max_threads = 24; + + /* BRW_NEW_URB_FENCE */ + sf->thread4.max_threads = MIN2(chipset_max_threads, + brw->urb.nr_sf_entries) - 1; + + /* BRW_NEW_SF_VP */ + sf->sf5.sf_viewport_state_offset = (brw->batch.bo->offset64 + + brw->sf.vp_offset) >> 5; /* reloc */ + + sf->sf5.viewport_transform = 1; + + sf->sf6.scissor = 1; + + /* _NEW_POLYGON */ + if (brw->polygon_front_bit) + sf->sf5.front_winding = BRW_FRONTWINDING_CW; + else + sf->sf5.front_winding = BRW_FRONTWINDING_CCW; + + /* _NEW_BUFFERS + * The viewport is inverted for rendering to a FBO, and that inverts + * polygon front/back orientation. + */ + sf->sf5.front_winding ^= render_to_fbo; + + /* _NEW_POLYGON */ + switch (ctx->Polygon.CullFlag ? ctx->Polygon.CullFaceMode : GL_NONE) { + case GL_FRONT: + sf->sf6.cull_mode = BRW_CULLMODE_FRONT; + break; + case GL_BACK: + sf->sf6.cull_mode = BRW_CULLMODE_BACK; + break; + case GL_FRONT_AND_BACK: + sf->sf6.cull_mode = BRW_CULLMODE_BOTH; + break; + case GL_NONE: + sf->sf6.cull_mode = BRW_CULLMODE_NONE; + break; + default: + unreachable("not reached"); + } + + /* _NEW_LINE */ + sf->sf6.line_width = U_FIXED(brw_get_line_width(brw), 1); + + if (ctx->Line.SmoothFlag) { + sf->sf6.aa_enable = 1; + sf->sf6.line_endcap_aa_region_width = 1; + } + + sf->sf6.point_rast_rule = BRW_RASTRULE_UPPER_RIGHT; + + /* _NEW_POINT */ + sf->sf7.sprite_point = ctx->Point.PointSprite; + + float point_sz; + point_sz = CLAMP(ctx->Point.Size, ctx->Point.MinSize, ctx->Point.MaxSize); + point_sz = CLAMP(point_sz, 0.125f, 255.875f); + sf->sf7.point_size = U_FIXED(point_sz, 3); + + /* _NEW_PROGRAM | _NEW_POINT, BRW_NEW_VUE_MAP_GEOM_OUT */ + sf->sf7.use_point_size_state = use_state_point_size(brw); + sf->sf7.aa_line_distance_mode = brw->is_g4x || brw->gen == 5; + + /* might be BRW_NEW_PRIMITIVE if we have to adjust pv for polygons: + * _NEW_LIGHT + */ + if (ctx->Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) { + sf->sf7.trifan_pv = 2; + sf->sf7.linestrip_pv = 1; + sf->sf7.tristrip_pv = 2; + } else { + sf->sf7.trifan_pv = 1; + sf->sf7.linestrip_pv = 0; + sf->sf7.tristrip_pv = 0; + } + sf->sf7.line_last_pixel_enable = 0; + + /* Set bias for OpenGL rasterization rules: + */ + sf->sf6.dest_org_vbias = 0x8; + sf->sf6.dest_org_hbias = 0x8; + + /* STATE_PREFETCH command description describes this state as being + * something loaded through the GPE (L2 ISC), so it's INSTRUCTION domain. + */ + + /* Emit SF viewport relocation */ + brw_emit_reloc(&brw->batch, + brw->sf.state_offset + + offsetof(struct brw_sf_unit_state, sf5), + brw->batch.bo, + brw->sf.vp_offset | sf->sf5.front_winding | + (sf->sf5.viewport_transform << 1), + I915_GEM_DOMAIN_INSTRUCTION, 0); + + brw->ctx.NewDriverState |= BRW_NEW_GEN4_UNIT_STATE; +} + +const struct brw_tracked_state brw_sf_unit = { + .dirty = { + .mesa = _NEW_BUFFERS | + _NEW_LIGHT | + _NEW_LINE | + _NEW_POINT | + _NEW_POLYGON | + _NEW_PROGRAM, + .brw = BRW_NEW_BATCH | + BRW_NEW_BLORP | + BRW_NEW_PROGRAM_CACHE | + BRW_NEW_SF_PROG_DATA | + BRW_NEW_SF_VP | + BRW_NEW_VUE_MAP_GEOM_OUT | + BRW_NEW_URB_FENCE, + }, + .emit = upload_sf_unit, +}; diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c index b0e423f2f4d..16b7b25e8ba 100644 --- a/src/mesa/drivers/dri/i965/genX_state_upload.c +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c @@ -1274,7 +1274,7 @@ genX(upload_clip_state)(struct brw_context *brw) #endif #if GEN_GEN == 7 - clip.FrontWinding = ctx->Polygon._FrontBit == _mesa_is_user_fbo(fb); + clip.FrontWinding = brw->polygon_front_bit == _mesa_is_user_fbo(fb); if (ctx->Polygon.CullFlag) { switch (ctx->Polygon.CullFaceMode) { @@ -1441,7 +1441,7 @@ genX(upload_sf)(struct brw_context *brw) #if GEN_GEN <= 7 /* _NEW_POLYGON */ - sf.FrontWinding = ctx->Polygon._FrontBit == render_to_fbo; + sf.FrontWinding = brw->polygon_front_bit == render_to_fbo; #if GEN_GEN >= 6 sf.GlobalDepthOffsetEnableSolid = ctx->Polygon.OffsetFill; sf.GlobalDepthOffsetEnableWireframe = ctx->Polygon.OffsetLine; @@ -3879,7 +3879,7 @@ genX(upload_raster)(struct brw_context *brw) struct gl_point_attrib *point = &ctx->Point; brw_batch_emit(brw, GENX(3DSTATE_RASTER), raster) { - if (polygon->_FrontBit == render_to_fbo) + if (brw->polygon_front_bit == render_to_fbo) raster.FrontWinding = CounterClockwise; if (polygon->CullFlag) { diff --git a/src/mesa/drivers/dri/r200/r200_swtcl.c b/src/mesa/drivers/dri/r200/r200_swtcl.c index 6ca85f5684d..0fda58656c7 100644 --- a/src/mesa/drivers/dri/r200/r200_swtcl.c +++ b/src/mesa/drivers/dri/r200/r200_swtcl.c @@ -38,6 +38,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "main/image.h" #include "main/imports.h" #include "main/macros.h" +#include "main/state.h" #include "swrast/s_context.h" #include "swrast/s_fog.h" diff --git a/src/mesa/drivers/dri/radeon/radeon_swtcl.c b/src/mesa/drivers/dri/radeon/radeon_swtcl.c index f2bc462e58a..d5365cddcdf 100644 --- a/src/mesa/drivers/dri/radeon/radeon_swtcl.c +++ b/src/mesa/drivers/dri/radeon/radeon_swtcl.c @@ -37,6 +37,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "main/enums.h" #include "main/imports.h" #include "main/macros.h" +#include "main/state.h" #include "math/m_xform.h" diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index e36bb919964..61c5a7519d9 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -803,7 +803,6 @@ struct gl_polygon_attrib GLenum FrontFace; /**< Either GL_CW or GL_CCW */ GLenum FrontMode; /**< Either GL_POINT, GL_LINE or GL_FILL */ GLenum BackMode; /**< Either GL_POINT, GL_LINE or GL_FILL */ - GLboolean _FrontBit; /**< 0=GL_CCW, 1=GL_CW */ GLboolean CullFlag; /**< Culling on/off flag */ GLboolean SmoothFlag; /**< True if GL_POLYGON_SMOOTH is enabled */ GLboolean StippleFlag; /**< True if GL_POLYGON_STIPPLE is enabled */ diff --git a/src/mesa/main/polygon.c b/src/mesa/main/polygon.c index 1bb7190bc24..e509fe4d989 100644 --- a/src/mesa/main/polygon.c +++ b/src/mesa/main/polygon.c @@ -318,7 +318,6 @@ void _mesa_init_polygon( struct gl_context * ctx ) ctx->Polygon.CullFlag = GL_FALSE; ctx->Polygon.CullFaceMode = GL_BACK; ctx->Polygon.FrontFace = GL_CCW; - ctx->Polygon._FrontBit = 0; ctx->Polygon.FrontMode = GL_FILL; ctx->Polygon.BackMode = GL_FILL; ctx->Polygon.SmoothFlag = GL_FALSE; diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 0772e6b82a1..79727983f1f 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -274,21 +274,6 @@ update_program_constants(struct gl_context *ctx) } - - -/** - * Update the ctx->Polygon._FrontBit flag. - */ -static void -update_frontbit(struct gl_context *ctx) -{ - if (ctx->Transform.ClipOrigin == GL_LOWER_LEFT) - ctx->Polygon._FrontBit = (ctx->Polygon.FrontFace == GL_CW); - else - ctx->Polygon._FrontBit = (ctx->Polygon.FrontFace == GL_CCW); -} - - /** * Compute derived GL state. * If __struct gl_contextRec::NewState is non-zero then this function \b must @@ -348,9 +333,6 @@ _mesa_update_state_locked( struct gl_context *ctx ) if (new_state & (_NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE | _NEW_PROGRAM)) _mesa_update_texture_state(ctx); - if (new_state & _NEW_POLYGON) - update_frontbit( ctx ); - if (new_state & _NEW_BUFFERS) _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer); diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h index 8817a4776d1..6d81c3f421b 100644 --- a/src/mesa/main/state.h +++ b/src/mesa/main/state.h @@ -83,4 +83,14 @@ _mesa_vertex_program_two_side_enabled(const struct gl_context *ctx) return ctx->Light.Enabled && ctx->Light.Model.TwoSide; } +/** Return 0=GL_CCW or 1=GL_CW */ +static inline bool +_mesa_polygon_get_front_bit(const struct gl_context *ctx) +{ + if (ctx->Transform.ClipOrigin == GL_LOWER_LEFT) + return ctx->Polygon.FrontFace == GL_CW; + + return ctx->Polygon.FrontFace == GL_CCW; +} + #endif diff --git a/src/mesa/swrast_setup/ss_triangle.c b/src/mesa/swrast_setup/ss_triangle.c index 8f034d8aaf0..d3a0e23109e 100644 --- a/src/mesa/swrast_setup/ss_triangle.c +++ b/src/mesa/swrast_setup/ss_triangle.c @@ -30,6 +30,7 @@ #include "main/macros.h" #include "main/mtypes.h" #include "main/stencil.h" +#include "main/state.h" #include "tnl/t_context.h" diff --git a/src/mesa/swrast_setup/ss_tritmp.h b/src/mesa/swrast_setup/ss_tritmp.h index adb77bd3247..c88747274bd 100644 --- a/src/mesa/swrast_setup/ss_tritmp.h +++ b/src/mesa/swrast_setup/ss_tritmp.h @@ -58,7 +58,7 @@ static void TAG(triangle)(struct gl_context *ctx, GLuint e0, GLuint e1, GLuint e if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT)) { - facing = (cc < 0.0F) ^ ctx->Polygon._FrontBit; + facing = (cc < 0.0F) ^ _mesa_polygon_get_front_bit(ctx); if (IND & SS_UNFILLED_BIT) mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode; diff --git a/src/mesa/tnl_dd/t_dd_tritmp.h b/src/mesa/tnl_dd/t_dd_tritmp.h index 2176f1f1667..2294a76a65c 100644 --- a/src/mesa/tnl_dd/t_dd_tritmp.h +++ b/src/mesa/tnl_dd/t_dd_tritmp.h @@ -137,7 +137,7 @@ static void TAG(triangle)( struct gl_context *ctx, GLuint e0, GLuint e1, GLuint if (DO_TWOSIDE || DO_UNFILLED || DO_TWOSTENCIL) { - facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit; + facing = AREA_IS_CCW( cc ) ^ _mesa_polygon_get_front_bit(ctx); if (DO_UNFILLED) { if (facing) { @@ -362,7 +362,7 @@ static void TAG(quadr)( struct gl_context *ctx, if (DO_TWOSIDE || DO_UNFILLED || DO_TWOSTENCIL) { - facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit; + facing = AREA_IS_CCW( cc ) ^ _mesa_polygon_get_front_bit(ctx); if (DO_UNFILLED) { if (facing) { -- 2.30.2