Home | History | Annotate | Download | only in i965
      1 /*
      2  * Copyright  2011 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 
     24 #include "brw_context.h"
     25 #include "brw_state.h"
     26 #include "brw_defines.h"
     27 #include "brw_util.h"
     28 #include "intel_batchbuffer.h"
     29 #include "main/fbobject.h"
     30 
     31 static void
     32 upload_clip_state(struct brw_context *brw)
     33 {
     34    struct intel_context *intel = &brw->intel;
     35    struct gl_context *ctx = &intel->ctx;
     36    uint32_t depth_clamp = 0;
     37    uint32_t provoking, userclip;
     38    uint32_t dw1 = GEN6_CLIP_STATISTICS_ENABLE;
     39    uint32_t nonperspective_barycentric_enable_flag = 0;
     40 
     41    /* _NEW_BUFFERS */
     42    bool render_to_fbo = _mesa_is_user_fbo(brw->intel.ctx.DrawBuffer);
     43 
     44    /* CACHE_NEW_WM_PROG */
     45    if (brw->wm.prog_data->barycentric_interp_modes &
     46        BRW_WM_NONPERSPECTIVE_BARYCENTRIC_BITS) {
     47       nonperspective_barycentric_enable_flag =
     48          GEN6_CLIP_NON_PERSPECTIVE_BARYCENTRIC_ENABLE;
     49    }
     50 
     51    dw1 |= GEN7_CLIP_EARLY_CULL;
     52 
     53    /* _NEW_POLYGON */
     54    if ((ctx->Polygon.FrontFace == GL_CCW) ^ render_to_fbo)
     55       dw1 |= GEN7_CLIP_WINDING_CCW;
     56 
     57    if (ctx->Polygon.CullFlag) {
     58       switch (ctx->Polygon.CullFaceMode) {
     59       case GL_FRONT:
     60 	 dw1 |= GEN7_CLIP_CULLMODE_FRONT;
     61 	 break;
     62       case GL_BACK:
     63 	 dw1 |= GEN7_CLIP_CULLMODE_BACK;
     64 	 break;
     65       case GL_FRONT_AND_BACK:
     66 	 dw1 |= GEN7_CLIP_CULLMODE_BOTH;
     67 	 break;
     68       default:
     69 	 assert(!"Should not get here: invalid CullFlag");
     70 	 break;
     71       }
     72    } else {
     73       dw1 |= GEN7_CLIP_CULLMODE_NONE;
     74    }
     75 
     76    /* _NEW_TRANSFORM */
     77    if (!ctx->Transform.DepthClamp)
     78       depth_clamp = GEN6_CLIP_Z_TEST;
     79 
     80    /* _NEW_LIGHT */
     81    if (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION) {
     82       provoking =
     83 	 (0 << GEN6_CLIP_TRI_PROVOKE_SHIFT) |
     84 	 (1 << GEN6_CLIP_TRIFAN_PROVOKE_SHIFT) |
     85 	 (0 << GEN6_CLIP_LINE_PROVOKE_SHIFT);
     86    } else {
     87       provoking =
     88 	 (2 << GEN6_CLIP_TRI_PROVOKE_SHIFT) |
     89 	 (2 << GEN6_CLIP_TRIFAN_PROVOKE_SHIFT) |
     90 	 (1 << GEN6_CLIP_LINE_PROVOKE_SHIFT);
     91    }
     92 
     93    /* _NEW_TRANSFORM */
     94    userclip = ctx->Transform.ClipPlanesEnabled;
     95 
     96    BEGIN_BATCH(4);
     97    OUT_BATCH(_3DSTATE_CLIP << 16 | (4 - 2));
     98    OUT_BATCH(dw1);
     99    OUT_BATCH(GEN6_CLIP_ENABLE |
    100 	     GEN6_CLIP_API_OGL |
    101 	     GEN6_CLIP_MODE_NORMAL |
    102              nonperspective_barycentric_enable_flag |
    103 	     GEN6_CLIP_XY_TEST |
    104 	     userclip << GEN6_USER_CLIP_CLIP_DISTANCES_SHIFT |
    105 	     depth_clamp |
    106 	     provoking);
    107    OUT_BATCH(U_FIXED(0.125, 3) << GEN6_CLIP_MIN_POINT_WIDTH_SHIFT |
    108              U_FIXED(255.875, 3) << GEN6_CLIP_MAX_POINT_WIDTH_SHIFT |
    109              GEN6_CLIP_FORCE_ZERO_RTAINDEX);
    110    ADVANCE_BATCH();
    111 }
    112 
    113 const struct brw_tracked_state gen7_clip_state = {
    114    .dirty = {
    115       .mesa  = (_NEW_BUFFERS |
    116                 _NEW_POLYGON |
    117                 _NEW_LIGHT |
    118                 _NEW_TRANSFORM),
    119       .brw   = BRW_NEW_CONTEXT,
    120       .cache = CACHE_NEW_WM_PROG
    121    },
    122    .emit = upload_clip_state,
    123 };
    124