mesa: replace ctx->Polygon._FrontBit with a helper function
authorMarek Olšák <marek.olsak@amd.com>
Fri, 9 Jun 2017 19:42:12 +0000 (21:42 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 21 Jun 2017 23:51:02 +0000 (01:51 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
16 files changed:
src/mesa/drivers/dri/i915/intel_tris.c
src/mesa/drivers/dri/i965/brw_clip.c
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_sf.c
src/mesa/drivers/dri/i965/brw_sf_state.c [new file with mode: 0644]
src/mesa/drivers/dri/i965/genX_state_upload.c
src/mesa/drivers/dri/r200/r200_swtcl.c
src/mesa/drivers/dri/radeon/radeon_swtcl.c
src/mesa/main/mtypes.h
src/mesa/main/polygon.c
src/mesa/main/state.c
src/mesa/main/state.h
src/mesa/swrast_setup/ss_triangle.c
src/mesa/swrast_setup/ss_tritmp.h
src/mesa/tnl_dd/t_dd_tritmp.h

index 36cba22780bf36514c9f694484efd9b2aed5b3f3..70e4fa308c6a775ad964dfd30e0c487977c12af8 100644 (file)
@@ -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"
index d8805ff4fa54c4c39c823c8213c96d3951108eb6..e3023e50e9cd3ce1762b4f7df71806b661e44880 100644 (file)
@@ -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;
index ec87817c5173e1847f7f0dded324c5573c1e9e0b..e9de5b7b238b7f47fb5e791897ed08de27499b09 100644 (file)
@@ -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. */
index 2eea3030115d2ac04a795c746918247ac5580b05..0e300c6c2a137ae5661cdc6238a291805d2b5d52 100644 (file)
@@ -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;
 
index d92b5197fdd5e19b8b5faf543c6e8fce03452465..1d5023258a772497c8b3d6240d71cde62bd145ed 100644 (file)
@@ -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 (file)
index 0000000..c739201
--- /dev/null
@@ -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 <keithw@vmware.com>
+  */
+
+
+
+#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,
+};
index b0e423f2f4d3a714b7beda513702c0a7aef6046f..16b7b25e8ba1970688f66d0dbe38a81213c1bc75 100644 (file)
@@ -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) {
index 6ca85f5684d1a3a809dcfdf88f28f8c7c02fd71f..0fda58656c730f4b78514c5e127179a29c00d7ee 100644 (file)
@@ -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"
index f2bc462e58a8149e25ce41c397b308b08cad34e7..d5365cddcdf487fff7cd558eba7d90aba68cf4c6 100644 (file)
@@ -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"
 
index e36bb9199642c112c90c34247b9a4589565d5ed0..61c5a7519d9630f66b69c8b605ace340dc7c4fdd 100644 (file)
@@ -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 */
index 1bb7190bc24aefb423f16630bbc2e8ab6f865a54..e509fe4d989b58041259036d4f5bc09222d0c9b8 100644 (file)
@@ -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;
index 0772e6b82a1b8e51f89f5aad7d929abdbdd86070..79727983f1f4b39907423e11606f92a6fcb35b72 100644 (file)
@@ -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);
 
index 8817a4776d1c62877c197ea0921b19f0c306f6ed..6d81c3f421b33dca7a1581936ad19261d9319fb7 100644 (file)
@@ -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
index 8f034d8aaf0c12402211af689ddd7d691cd2f825..d3a0e23109ee939666b3aa58faad707a0e938d8c 100644 (file)
@@ -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"
 
index adb77bd32472b6343cceddf193e4b645bcabc658..c88747274bdc10749aaa1fe748f54795fbad647e 100644 (file)
@@ -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;
index 2176f1f1667387affee656dd033c9b1a6623dc3f..2294a76a65cb217e37d78a873123b0fa3bd1b394 100644 (file)
@@ -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) {