1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org distribute, sublicense, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next paragraph) shall be included in all copies or substantial
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  * Authors:
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *   Keith Whitwell <keith@tungstengraphics.com>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_util.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_batchbuffer.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_cc_vp(struct brw_context *brw)
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &brw->intel.ctx;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cc_viewport *ccv;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ccv = brw_state_batch(brw, AUB_TRACE_CC_VP_STATE,
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 sizeof(*ccv), 32, &brw->cc.vp_offset);
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_TRANSFORM */
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Transform.DepthClamp) {
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* _NEW_VIEWPORT */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ccv->min_depth = MIN2(ctx->Viewport.Near, ctx->Viewport.Far);
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ccv->max_depth = MAX2(ctx->Viewport.Near, ctx->Viewport.Far);
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ccv->min_depth = 0.0;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ccv->max_depth = 1.0;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->state.dirty.cache |= CACHE_NEW_CC_VP;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_cc_vp = {
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = _NEW_VIEWPORT | _NEW_TRANSFORM,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = BRW_NEW_BATCH,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = 0
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_upload_cc_vp
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Modify blend function to force destination alpha to 1.0
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If \c function specifies a blend function that uses destination alpha,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * replace it with a function that hard-wires destination alpha to 1.0.  This
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is used when rendering to xRGB targets.
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfix_xRGB_alpha(GLenum function)
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (function) {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DST_ALPHA:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_ONE;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_DST_ALPHA:
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SRC_ALPHA_SATURATE:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_ZERO;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return function;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Creates the state cache entry for the given CC unit key.
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void upload_cc_unit(struct brw_context *brw)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &brw->intel.ctx;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cc_unit_state *cc;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cc = brw_state_batch(brw, AUB_TRACE_CC_STATE,
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sizeof(*cc), 64, &brw->cc.state_offset);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(cc, 0, sizeof(*cc));
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_STENCIL */
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Stencil._Enabled) {
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const unsigned back = ctx->Stencil._BackFace;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc0.stencil_enable = 1;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc0.stencil_func =
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_translate_compare_func(ctx->Stencil.Function[0]);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc0.stencil_fail_op =
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_translate_stencil_op(ctx->Stencil.FailFunc[0]);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc0.stencil_pass_depth_fail_op =
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_translate_stencil_op(ctx->Stencil.ZFailFunc[0]);
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc0.stencil_pass_depth_pass_op =
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_translate_stencil_op(ctx->Stencil.ZPassFunc[0]);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc1.stencil_ref = ctx->Stencil.Ref[0];
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc1.stencil_write_mask = ctx->Stencil.WriteMask[0];
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc1.stencil_test_mask = ctx->Stencil.ValueMask[0];
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil._TestTwoSide) {
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc0.bf_stencil_enable = 1;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc0.bf_stencil_func =
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel_translate_compare_func(ctx->Stencil.Function[back]);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc0.bf_stencil_fail_op =
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel_translate_stencil_op(ctx->Stencil.FailFunc[back]);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc0.bf_stencil_pass_depth_fail_op =
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel_translate_stencil_op(ctx->Stencil.ZFailFunc[back]);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc0.bf_stencil_pass_depth_pass_op =
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel_translate_stencil_op(ctx->Stencil.ZPassFunc[back]);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc1.bf_stencil_ref = ctx->Stencil.Ref[back];
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc2.bf_stencil_write_mask = ctx->Stencil.WriteMask[back];
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc2.bf_stencil_test_mask = ctx->Stencil.ValueMask[back];
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Not really sure about this:
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.WriteMask[0] ||
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (ctx->Stencil._TestTwoSide && ctx->Stencil.WriteMask[back]))
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 cc->cc0.stencil_write_enable = 1;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_COLOR */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Color.ColorLogicOpEnabled && ctx->Color.LogicOp != GL_COPY) {
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc2.logicop_enable = 1;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc5.logicop_func = intel_translate_logic_op(ctx->Color.LogicOp);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (ctx->Color.BlendEnabled) {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum eqRGB = ctx->Color.Blend[0].EquationRGB;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum eqA = ctx->Color.Blend[0].EquationA;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum srcRGB = ctx->Color.Blend[0].SrcRGB;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum dstRGB = ctx->Color.Blend[0].DstRGB;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum srcA = ctx->Color.Blend[0].SrcA;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum dstA = ctx->Color.Blend[0].DstA;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* If the renderbuffer is XRGB, we have to frob the blend function to
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * force the destination alpha to 1.0.  This means replacing GL_DST_ALPHA
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * with GL_ONE and GL_ONE_MINUS_DST_ALPHA with GL_ZERO.
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->DrawBuffer->Visual.alphaBits == 0) {
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcRGB = fix_xRGB_alpha(srcRGB);
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcA   = fix_xRGB_alpha(srcA);
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstRGB = fix_xRGB_alpha(dstRGB);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dstA   = fix_xRGB_alpha(dstA);
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (eqRGB == GL_MIN || eqRGB == GL_MAX) {
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcRGB = dstRGB = GL_ONE;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (eqA == GL_MIN || eqA == GL_MAX) {
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 srcA = dstA = GL_ONE;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc6.dest_blend_factor = brw_translate_blend_factor(dstRGB);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc6.src_blend_factor = brw_translate_blend_factor(srcRGB);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc6.blend_function = brw_translate_blend_equation(eqRGB);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc5.ia_dest_blend_factor = brw_translate_blend_factor(dstA);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc5.ia_src_blend_factor = brw_translate_blend_factor(srcA);
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc5.ia_blend_function = brw_translate_blend_equation(eqA);
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc3.blend_enable = 1;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc3.ia_blend_enable = (srcA != srcRGB ||
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				dstA != dstRGB ||
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				eqA != eqRGB);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Color.AlphaEnabled) {
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc3.alpha_test = 1;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc3.alpha_test_func =
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_translate_compare_func(ctx->Color.AlphaFunc);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc3.alpha_test_format = BRW_ALPHATEST_FORMAT_UNORM8;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_UBYTE(cc->cc7.alpha_ref.ub[0], ctx->Color.AlphaRef);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Color.DitherFlag) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc5.dither_enable = 1;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc6.y_dither_offset = 0;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc6.x_dither_offset = 0;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_DEPTH */
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Depth.Test) {
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc2.depth_test = 1;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc2.depth_test_function =
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_translate_compare_func(ctx->Depth.Func);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc2.depth_write_enable = ctx->Depth.Mask;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->stats_wm || unlikely(INTEL_DEBUG & DEBUG_STATS))
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cc->cc5.statistics_enable = 1;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* CACHE_NEW_CC_VP */
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cc->cc4.cc_viewport_state_offset = (intel->batch.bo->offset +
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       brw->cc.vp_offset) >> 5; /* reloc */
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->state.dirty.cache |= CACHE_NEW_CC_UNIT;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Emit CC viewport relocation */
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   (brw->cc.state_offset +
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    offsetof(struct brw_cc_unit_state, cc4)),
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   intel->batch.bo, brw->cc.vp_offset,
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   I915_GEM_DOMAIN_INSTRUCTION, 0);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_cc_unit = {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = _NEW_STENCIL | _NEW_COLOR | _NEW_DEPTH,
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = BRW_NEW_BATCH,
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = CACHE_NEW_CC_VP
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = upload_cc_unit,
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void upload_blend_constant_color(struct brw_context *brw)
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_BATCH(5);
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OUT_BATCH(_3DSTATE_BLEND_CONSTANT_COLOR << 16 | (5-2));
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OUT_BATCH_F(ctx->Color.BlendColorUnclamped[0]);
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OUT_BATCH_F(ctx->Color.BlendColorUnclamped[1]);
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OUT_BATCH_F(ctx->Color.BlendColorUnclamped[2]);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OUT_BATCH_F(ctx->Color.BlendColorUnclamped[3]);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CACHED_BATCH();
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_blend_constant_color = {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = _NEW_COLOR,
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = BRW_NEW_CONTEXT,
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = 0
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = upload_blend_constant_color
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
261