101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/**************************************************************************
201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * All Rights Reserved.
501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * copy of this software and associated documentation files (the
801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * "Software"), to deal in the Software without restriction, including
901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
1001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
1101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to
1201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * the following conditions:
1301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
1401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * The above copyright notice and this permission notice (including the
1501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * next paragraph) shall be included in all copies or substantial portions
1601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * of the Software.
1701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
1801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
2601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell **************************************************************************/
2701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
2801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
2901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_reg.h"
3001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_context.h"
3101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_batch.h"
32abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz#include "i915_debug.h"
3345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin#include "i915_fpc.h"
34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_resource.h"
3501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
3601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "pipe/p_context.h"
3701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "pipe/p_defines.h"
38465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin#include "pipe/p_format.h"
3901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
40465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin#include "util/u_format.h"
41b9baad2aff6ddc5145d91cbfb81d083a21990a80Jakob Bornecrantz#include "util/u_math.h"
42342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter#include "util/u_memory.h"
43b9baad2aff6ddc5145d91cbfb81d083a21990a80Jakob Bornecrantz
44342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstruct i915_tracked_hw_state {
45342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   const char *name;
46179cb587954ff90efa477945297272680c750149Daniel Vetter   void (*validate)(struct i915_context *, unsigned *batch_space);
47342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   void (*emit)(struct i915_context *);
48d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   unsigned dirty, batch_space;
49342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter};
50342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
51342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
52342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic void
53179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_flush(struct i915_context *i915, unsigned *batch_space)
54179cb587954ff90efa477945297272680c750149Daniel Vetter{
55179cb587954ff90efa477945297272680c750149Daniel Vetter   *batch_space = i915->flush_dirty ? 1 : 0;
56179cb587954ff90efa477945297272680c750149Daniel Vetter}
57179cb587954ff90efa477945297272680c750149Daniel Vetter
58179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
59d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetteremit_flush(struct i915_context *i915)
60d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter{
61d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   /* Cache handling is very cheap atm. State handling can request to flushes:
62d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter    * - I915_FLUSH_CACHE which is a flush everything request and
63d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter    * - I915_PIPELINE_FLUSH which is specifically for the draw_offset flush.
64d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter    * Because the cache handling is so dumb, no explicit "invalidate map cache".
65d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter    * Also, the first is a strict superset of the latter, so the following logic
66d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter    * works. */
67d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   if (i915->flush_dirty & I915_FLUSH_CACHE)
68d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter      OUT_BATCH(MI_FLUSH | FLUSH_MAP_CACHE);
69d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   else if (i915->flush_dirty & I915_PIPELINE_FLUSH)
70d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter      OUT_BATCH(MI_FLUSH | INHIBIT_FLUSH_RENDER_CACHE);
71d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter}
72d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter
73179cb587954ff90efa477945297272680c750149Daniel Vetteruint32_t invariant_state[] = {
74179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_AA_CMD | AA_LINE_ECAAR_WIDTH_ENABLE | AA_LINE_ECAAR_WIDTH_1_0 |
75179cb587954ff90efa477945297272680c750149Daniel Vetter             AA_LINE_REGION_WIDTH_ENABLE | AA_LINE_REGION_WIDTH_1_0,
76179cb587954ff90efa477945297272680c750149Daniel Vetter
77179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_DFLT_DIFFUSE_CMD, 0,
78179cb587954ff90efa477945297272680c750149Daniel Vetter
79179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_DFLT_SPEC_CMD, 0,
80179cb587954ff90efa477945297272680c750149Daniel Vetter
81179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_DFLT_Z_CMD, 0,
82179cb587954ff90efa477945297272680c750149Daniel Vetter
83179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_COORD_SET_BINDINGS |
84179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(0, 0) |
85179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(1, 1) |
86179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(2, 2) |
87179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(3, 3) |
88179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(4, 4) |
89179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(5, 5) |
90179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(6, 6) |
91179cb587954ff90efa477945297272680c750149Daniel Vetter             CSB_TCB(7, 7),
92179cb587954ff90efa477945297272680c750149Daniel Vetter
93179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_RASTER_RULES_CMD |
94179cb587954ff90efa477945297272680c750149Daniel Vetter             ENABLE_POINT_RASTER_RULE |
95179cb587954ff90efa477945297272680c750149Daniel Vetter             OGL_POINT_RASTER_RULE |
96179cb587954ff90efa477945297272680c750149Daniel Vetter             ENABLE_LINE_STRIP_PROVOKE_VRTX |
97179cb587954ff90efa477945297272680c750149Daniel Vetter             ENABLE_TRI_FAN_PROVOKE_VRTX |
98179cb587954ff90efa477945297272680c750149Daniel Vetter             LINE_STRIP_PROVOKE_VRTX(1) |
99179cb587954ff90efa477945297272680c750149Daniel Vetter             TRI_FAN_PROVOKE_VRTX(2) |
100179cb587954ff90efa477945297272680c750149Daniel Vetter             ENABLE_TEXKILL_3D_4D |
101179cb587954ff90efa477945297272680c750149Daniel Vetter             TEXKILL_4D,
102179cb587954ff90efa477945297272680c750149Daniel Vetter
103179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_DEPTH_SUBRECT_DISABLE,
104179cb587954ff90efa477945297272680c750149Daniel Vetter
105179cb587954ff90efa477945297272680c750149Daniel Vetter   /* disable indirect state for now
106179cb587954ff90efa477945297272680c750149Daniel Vetter    */
107179cb587954ff90efa477945297272680c750149Daniel Vetter   _3DSTATE_LOAD_INDIRECT | 0, 0};
108179cb587954ff90efa477945297272680c750149Daniel Vetter
109179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
110179cb587954ff90efa477945297272680c750149Daniel Vetteremit_invariant(struct i915_context *i915)
111179cb587954ff90efa477945297272680c750149Daniel Vetter{
112179cb587954ff90efa477945297272680c750149Daniel Vetter   i915_winsys_batchbuffer_write(i915->batch, invariant_state,
113179cb587954ff90efa477945297272680c750149Daniel Vetter                                 Elements(invariant_state)*sizeof(uint32_t));
114179cb587954ff90efa477945297272680c750149Daniel Vetter}
115179cb587954ff90efa477945297272680c750149Daniel Vetter
116d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetterstatic void
117179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_immediate(struct i915_context *i915, unsigned *batch_space)
118342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{
119179cb587954ff90efa477945297272680c750149Daniel Vetter   unsigned dirty = (1 << I915_IMMEDIATE_S0 | 1 << I915_IMMEDIATE_S1 |
120179cb587954ff90efa477945297272680c750149Daniel Vetter                     1 << I915_IMMEDIATE_S2 | 1 << I915_IMMEDIATE_S3 |
121179cb587954ff90efa477945297272680c750149Daniel Vetter                     1 << I915_IMMEDIATE_S3 | 1 << I915_IMMEDIATE_S4 |
122179cb587954ff90efa477945297272680c750149Daniel Vetter                     1 << I915_IMMEDIATE_S5 | 1 << I915_IMMEDIATE_S6) &
123179cb587954ff90efa477945297272680c750149Daniel Vetter                    i915->immediate_dirty;
124179cb587954ff90efa477945297272680c750149Daniel Vetter
125b0dd74aaf730f59d5d29db71a3617ab9eb1cb62fDaniel Vetter   if (i915->immediate_dirty & (1 << I915_IMMEDIATE_S0) && i915->vbo)
126342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      i915->validation_buffers[i915->num_validation_buffers++] = i915->vbo;
127179cb587954ff90efa477945297272680c750149Daniel Vetter
128179cb587954ff90efa477945297272680c750149Daniel Vetter   *batch_space = 1 + util_bitcount(dirty);
129179cb587954ff90efa477945297272680c750149Daniel Vetter}
130179cb587954ff90efa477945297272680c750149Daniel Vetter
131179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
132179cb587954ff90efa477945297272680c750149Daniel Vetteremit_immediate(struct i915_context *i915)
133179cb587954ff90efa477945297272680c750149Daniel Vetter{
134a9cb01f35597797a83ac940b0230a8f74f99a1b8Stéphane Marchesin   /* remove unwanted bits and S7 */
135179cb587954ff90efa477945297272680c750149Daniel Vetter   unsigned dirty = (1 << I915_IMMEDIATE_S0 | 1 << I915_IMMEDIATE_S1 |
136179cb587954ff90efa477945297272680c750149Daniel Vetter                     1 << I915_IMMEDIATE_S2 | 1 << I915_IMMEDIATE_S3 |
137179cb587954ff90efa477945297272680c750149Daniel Vetter                     1 << I915_IMMEDIATE_S3 | 1 << I915_IMMEDIATE_S4 |
138179cb587954ff90efa477945297272680c750149Daniel Vetter                     1 << I915_IMMEDIATE_S5 | 1 << I915_IMMEDIATE_S6) &
139179cb587954ff90efa477945297272680c750149Daniel Vetter                    i915->immediate_dirty;
140179cb587954ff90efa477945297272680c750149Daniel Vetter   int i, num = util_bitcount(dirty);
141179cb587954ff90efa477945297272680c750149Daniel Vetter   assert(num && num <= I915_MAX_IMMEDIATE);
142179cb587954ff90efa477945297272680c750149Daniel Vetter
143179cb587954ff90efa477945297272680c750149Daniel Vetter   OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 |
144179cb587954ff90efa477945297272680c750149Daniel Vetter             dirty << 4 | (num - 1));
145179cb587954ff90efa477945297272680c750149Daniel Vetter
146179cb587954ff90efa477945297272680c750149Daniel Vetter   if (i915->immediate_dirty & (1 << I915_IMMEDIATE_S0)) {
147179cb587954ff90efa477945297272680c750149Daniel Vetter      if (i915->vbo)
148179cb587954ff90efa477945297272680c750149Daniel Vetter         OUT_RELOC(i915->vbo, I915_USAGE_VERTEX,
149179cb587954ff90efa477945297272680c750149Daniel Vetter                   i915->current.immediate[I915_IMMEDIATE_S0]);
150179cb587954ff90efa477945297272680c750149Daniel Vetter      else
151179cb587954ff90efa477945297272680c750149Daniel Vetter         OUT_BATCH(0);
152179cb587954ff90efa477945297272680c750149Daniel Vetter   }
153179cb587954ff90efa477945297272680c750149Daniel Vetter
154179cb587954ff90efa477945297272680c750149Daniel Vetter   for (i = 1; i < I915_MAX_IMMEDIATE; i++) {
15523d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin      if (dirty & (1 << i)) {
15623d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin         /* Fixup blend function for A8 dst buffers.
15723d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin          * When we blend to an A8 buffer, the GPU thinks it's a G8 buffer,
15823d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin          * and therefore we need to use the color factor for alphas. */
15923d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin         if ((i == I915_IMMEDIATE_S6) &&
16023d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin             (i915->current.target_fixup_format == PIPE_FORMAT_A8_UNORM)) {
16123d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            uint32_t imm = i915->current.immediate[i];
16223d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            uint32_t srcRGB = (imm >> S6_CBUF_SRC_BLEND_FACT_SHIFT) & BLENDFACT_MASK;
16323d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            if (srcRGB == BLENDFACT_DST_ALPHA)
16423d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin               srcRGB = BLENDFACT_DST_COLR;
16523d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            else if (srcRGB == BLENDFACT_INV_DST_ALPHA)
16623d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin               srcRGB = BLENDFACT_INV_DST_COLR;
16723d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            imm &= ~SRC_BLND_FACT(BLENDFACT_MASK);
16823d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            imm |= SRC_BLND_FACT(srcRGB);
16923d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            OUT_BATCH(imm);
17023d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin         } else {
17123d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin            OUT_BATCH(i915->current.immediate[i]);
17223d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin         }
17323d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin      }
174179cb587954ff90efa477945297272680c750149Daniel Vetter   }
175179cb587954ff90efa477945297272680c750149Daniel Vetter}
176179cb587954ff90efa477945297272680c750149Daniel Vetter
177179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
178179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_dynamic(struct i915_context *i915, unsigned *batch_space)
179179cb587954ff90efa477945297272680c750149Daniel Vetter{
180179cb587954ff90efa477945297272680c750149Daniel Vetter   *batch_space = util_bitcount(i915->dynamic_dirty & ((1 << I915_MAX_DYNAMIC) - 1));
181179cb587954ff90efa477945297272680c750149Daniel Vetter}
182179cb587954ff90efa477945297272680c750149Daniel Vetter
183179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
184179cb587954ff90efa477945297272680c750149Daniel Vetteremit_dynamic(struct i915_context *i915)
185179cb587954ff90efa477945297272680c750149Daniel Vetter{
186179cb587954ff90efa477945297272680c750149Daniel Vetter   int i;
187179cb587954ff90efa477945297272680c750149Daniel Vetter   for (i = 0; i < I915_MAX_DYNAMIC; i++) {
188179cb587954ff90efa477945297272680c750149Daniel Vetter      if (i915->dynamic_dirty & (1 << i))
189179cb587954ff90efa477945297272680c750149Daniel Vetter         OUT_BATCH(i915->current.dynamic[i]);
190179cb587954ff90efa477945297272680c750149Daniel Vetter   }
191342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter}
192342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
193342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic void
194179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_static(struct i915_context *i915, unsigned *batch_space)
195342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{
196288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   *batch_space = 0;
197179cb587954ff90efa477945297272680c750149Daniel Vetter
198288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->current.cbuf_bo && (i915->static_dirty & I915_DST_BUF_COLOR)) {
199342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      i915->validation_buffers[i915->num_validation_buffers++]
200342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter         = i915->current.cbuf_bo;
201179cb587954ff90efa477945297272680c750149Daniel Vetter      *batch_space += 3;
202179cb587954ff90efa477945297272680c750149Daniel Vetter   }
203342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
204288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->current.depth_bo && (i915->static_dirty & I915_DST_BUF_DEPTH)) {
205342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      i915->validation_buffers[i915->num_validation_buffers++]
206342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter         = i915->current.depth_bo;
207179cb587954ff90efa477945297272680c750149Daniel Vetter      *batch_space += 3;
208179cb587954ff90efa477945297272680c750149Daniel Vetter   }
209288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter
210288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->static_dirty & I915_DST_VARS)
211288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      *batch_space += 2;
212288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter
213288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->static_dirty & I915_DST_RECT)
214288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      *batch_space += 5;
215179cb587954ff90efa477945297272680c750149Daniel Vetter}
216179cb587954ff90efa477945297272680c750149Daniel Vetter
217179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
218179cb587954ff90efa477945297272680c750149Daniel Vetteremit_static(struct i915_context *i915)
219179cb587954ff90efa477945297272680c750149Daniel Vetter{
220288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->current.cbuf_bo && (i915->static_dirty & I915_DST_BUF_COLOR)) {
221179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
222179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(i915->current.cbuf_flags);
223179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_RELOC(i915->current.cbuf_bo,
224179cb587954ff90efa477945297272680c750149Daniel Vetter                I915_USAGE_RENDER,
225179cb587954ff90efa477945297272680c750149Daniel Vetter                0);
226179cb587954ff90efa477945297272680c750149Daniel Vetter   }
227179cb587954ff90efa477945297272680c750149Daniel Vetter
228179cb587954ff90efa477945297272680c750149Daniel Vetter   /* What happens if no zbuf??
229179cb587954ff90efa477945297272680c750149Daniel Vetter    */
230288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->current.depth_bo && (i915->static_dirty & I915_DST_BUF_DEPTH)) {
231179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
232179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(i915->current.depth_flags);
233179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_RELOC(i915->current.depth_bo,
234179cb587954ff90efa477945297272680c750149Daniel Vetter                I915_USAGE_RENDER,
235179cb587954ff90efa477945297272680c750149Daniel Vetter                0);
236179cb587954ff90efa477945297272680c750149Daniel Vetter   }
237179cb587954ff90efa477945297272680c750149Daniel Vetter
238288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->static_dirty & I915_DST_VARS) {
239179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
240179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(i915->current.dst_buf_vars);
241179cb587954ff90efa477945297272680c750149Daniel Vetter   }
242342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter}
243342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
244342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic void
245179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_map(struct i915_context *i915, unsigned *batch_space)
246342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{
247342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   const uint enabled = i915->current.sampler_enable_flags;
248342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   uint unit;
249342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   struct i915_texture *tex;
250342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
251179cb587954ff90efa477945297272680c750149Daniel Vetter   *batch_space = i915->current.sampler_enable_nr ?
252179cb587954ff90efa477945297272680c750149Daniel Vetter     2 + 3*i915->current.sampler_enable_nr : 0;
253342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
254342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   for (unit = 0; unit < I915_TEX_UNITS; unit++) {
255342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      if (enabled & (1 << unit)) {
256179cb587954ff90efa477945297272680c750149Daniel Vetter         tex = i915_texture(i915->fragment_sampler_views[unit]->texture);
257179cb587954ff90efa477945297272680c750149Daniel Vetter         i915->validation_buffers[i915->num_validation_buffers++] = tex->buffer;
258342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      }
259342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   }
260342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter}
261342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
262179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
263179cb587954ff90efa477945297272680c750149Daniel Vetteremit_map(struct i915_context *i915)
264179cb587954ff90efa477945297272680c750149Daniel Vetter{
265179cb587954ff90efa477945297272680c750149Daniel Vetter   const uint nr = i915->current.sampler_enable_nr;
266179cb587954ff90efa477945297272680c750149Daniel Vetter   if (nr) {
267179cb587954ff90efa477945297272680c750149Daniel Vetter      const uint enabled = i915->current.sampler_enable_flags;
268179cb587954ff90efa477945297272680c750149Daniel Vetter      uint unit;
269179cb587954ff90efa477945297272680c750149Daniel Vetter      uint count = 0;
270179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(_3DSTATE_MAP_STATE | (3 * nr));
271179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH(enabled);
272179cb587954ff90efa477945297272680c750149Daniel Vetter      for (unit = 0; unit < I915_TEX_UNITS; unit++) {
273179cb587954ff90efa477945297272680c750149Daniel Vetter         if (enabled & (1 << unit)) {
274179cb587954ff90efa477945297272680c750149Daniel Vetter            struct i915_texture *texture = i915_texture(i915->fragment_sampler_views[unit]->texture);
275179cb587954ff90efa477945297272680c750149Daniel Vetter            struct i915_winsys_buffer *buf = texture->buffer;
276179cb587954ff90efa477945297272680c750149Daniel Vetter            assert(buf);
277179cb587954ff90efa477945297272680c750149Daniel Vetter
278179cb587954ff90efa477945297272680c750149Daniel Vetter            count++;
279179cb587954ff90efa477945297272680c750149Daniel Vetter
280179cb587954ff90efa477945297272680c750149Daniel Vetter            OUT_RELOC(buf, I915_USAGE_SAMPLER, 0);
281179cb587954ff90efa477945297272680c750149Daniel Vetter            OUT_BATCH(i915->current.texbuffer[unit][0]); /* MS3 */
282179cb587954ff90efa477945297272680c750149Daniel Vetter            OUT_BATCH(i915->current.texbuffer[unit][1]); /* MS4 */
283179cb587954ff90efa477945297272680c750149Daniel Vetter         }
284179cb587954ff90efa477945297272680c750149Daniel Vetter      }
285179cb587954ff90efa477945297272680c750149Daniel Vetter      assert(count == nr);
286179cb587954ff90efa477945297272680c750149Daniel Vetter   }
287179cb587954ff90efa477945297272680c750149Daniel Vetter}
288179cb587954ff90efa477945297272680c750149Daniel Vetter
289179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
290179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_sampler(struct i915_context *i915, unsigned *batch_space)
291179cb587954ff90efa477945297272680c750149Daniel Vetter{
292179cb587954ff90efa477945297272680c750149Daniel Vetter   *batch_space = i915->current.sampler_enable_nr ?
293179cb587954ff90efa477945297272680c750149Daniel Vetter     2 + 3*i915->current.sampler_enable_nr : 0;
294179cb587954ff90efa477945297272680c750149Daniel Vetter}
295179cb587954ff90efa477945297272680c750149Daniel Vetter
296179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
297179cb587954ff90efa477945297272680c750149Daniel Vetteremit_sampler(struct i915_context *i915)
298179cb587954ff90efa477945297272680c750149Daniel Vetter{
299179cb587954ff90efa477945297272680c750149Daniel Vetter   if (i915->current.sampler_enable_nr) {
300179cb587954ff90efa477945297272680c750149Daniel Vetter      int i;
301179cb587954ff90efa477945297272680c750149Daniel Vetter
302288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      OUT_BATCH( _3DSTATE_SAMPLER_STATE |
303179cb587954ff90efa477945297272680c750149Daniel Vetter                 (3 * i915->current.sampler_enable_nr) );
304179cb587954ff90efa477945297272680c750149Daniel Vetter
305179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH( i915->current.sampler_enable_flags );
306179cb587954ff90efa477945297272680c750149Daniel Vetter
307179cb587954ff90efa477945297272680c750149Daniel Vetter      for (i = 0; i < I915_TEX_UNITS; i++) {
308179cb587954ff90efa477945297272680c750149Daniel Vetter         if (i915->current.sampler_enable_flags & (1<<i)) {
309179cb587954ff90efa477945297272680c750149Daniel Vetter            OUT_BATCH( i915->current.sampler[i][0] );
310179cb587954ff90efa477945297272680c750149Daniel Vetter            OUT_BATCH( i915->current.sampler[i][1] );
311179cb587954ff90efa477945297272680c750149Daniel Vetter            OUT_BATCH( i915->current.sampler[i][2] );
312179cb587954ff90efa477945297272680c750149Daniel Vetter         }
313179cb587954ff90efa477945297272680c750149Daniel Vetter      }
314179cb587954ff90efa477945297272680c750149Daniel Vetter   }
315179cb587954ff90efa477945297272680c750149Daniel Vetter}
316179cb587954ff90efa477945297272680c750149Daniel Vetter
31745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic boolean is_tex_instruction(uint32_t* instruction)
31845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{
31945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   uint32_t op = instruction[0] &0xFF000000;
32045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   return ( (op == T0_TEXLD) ||
32145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin            (op == T0_TEXLDP) ||
32245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin            (op == T0_TEXLDB));
32345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin}
32445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
32545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic uint32_t tex_sampler(uint32_t* instruction)
32645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{
32745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   return ( instruction[0] & T0_SAMPLER_NR_MASK);
32845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin}
32945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
33045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic uint additional_constants(struct i915_context *i915)
33145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{
33245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int i;
33345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
33445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   for (i = 0 ; i < i915->fs->program_len; i+=3) {
33545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      if ( is_tex_instruction(i915->fs->program + i)) {
33645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin           int sampler = tex_sampler(i915->fs->program + i);
33745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin           assert(sampler < I915_TEX_UNITS);
33845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin           if ( i915->current.sampler_srgb[sampler] )
33945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin              return 1;
34045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      }
34145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   }
34245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   return 0;
34345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin}
34445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
345179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
346179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_constants(struct i915_context *i915, unsigned *batch_space)
347179cb587954ff90efa477945297272680c750149Daniel Vetter{
34845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int nr = i915->fs->num_constants ?
349179cb587954ff90efa477945297272680c750149Daniel Vetter      2 + 4*i915->fs->num_constants : 0;
35045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
35145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   nr += 4*additional_constants(i915);
35245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   *batch_space = nr;
353179cb587954ff90efa477945297272680c750149Daniel Vetter}
354179cb587954ff90efa477945297272680c750149Daniel Vetter
355179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
356179cb587954ff90efa477945297272680c750149Daniel Vetteremit_constants(struct i915_context *i915)
357179cb587954ff90efa477945297272680c750149Daniel Vetter{
358179cb587954ff90efa477945297272680c750149Daniel Vetter   /* Collate the user-defined constants with the fragment shader's
359179cb587954ff90efa477945297272680c750149Daniel Vetter    * immediates according to the constant_flags[] array.
360179cb587954ff90efa477945297272680c750149Daniel Vetter    */
36145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   const uint nr = i915->fs->num_constants + additional_constants(i915);
36245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
36345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   assert(nr < I915_MAX_CONSTANT);
364179cb587954ff90efa477945297272680c750149Daniel Vetter   if (nr) {
36545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      const float srgb_constants[4] = {1.0/1.055, 0.055/1.055, 2.4, 0.0822};
366179cb587954ff90efa477945297272680c750149Daniel Vetter      uint i;
367179cb587954ff90efa477945297272680c750149Daniel Vetter
368179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH( _3DSTATE_PIXEL_SHADER_CONSTANTS | (nr * 4) );
369179cb587954ff90efa477945297272680c750149Daniel Vetter      OUT_BATCH((1 << nr) - 1);
370179cb587954ff90efa477945297272680c750149Daniel Vetter
371179cb587954ff90efa477945297272680c750149Daniel Vetter      for (i = 0; i < nr; i++) {
372179cb587954ff90efa477945297272680c750149Daniel Vetter         const uint *c;
373179cb587954ff90efa477945297272680c750149Daniel Vetter         if (i915->fs->constant_flags[i] == I915_CONSTFLAG_USER) {
374179cb587954ff90efa477945297272680c750149Daniel Vetter            /* grab user-defined constant */
375179cb587954ff90efa477945297272680c750149Daniel Vetter            c = (uint *) i915_buffer(i915->constants[PIPE_SHADER_FRAGMENT])->data;
376179cb587954ff90efa477945297272680c750149Daniel Vetter            c += 4 * i;
377179cb587954ff90efa477945297272680c750149Daniel Vetter         }
37845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin         else if (i < i915->fs->num_constants) {
379179cb587954ff90efa477945297272680c750149Daniel Vetter            /* emit program constant */
380179cb587954ff90efa477945297272680c750149Daniel Vetter            c = (uint *) i915->fs->constants[i];
38145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin         } else {
38245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin            /* emit constants for sRGB */
38345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
38445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin            /* save const position in context for use in shader emit */
38545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin            i915->current.srgb_const_offset = i;
38645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
38745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin            c = (uint *) srgb_constants;
388179cb587954ff90efa477945297272680c750149Daniel Vetter         }
389179cb587954ff90efa477945297272680c750149Daniel Vetter#if 0 /* debug */
390179cb587954ff90efa477945297272680c750149Daniel Vetter         {
391179cb587954ff90efa477945297272680c750149Daniel Vetter            float *f = (float *) c;
392179cb587954ff90efa477945297272680c750149Daniel Vetter            printf("Const %2d: %f %f %f %f %s\n", i, f[0], f[1], f[2], f[3],
393179cb587954ff90efa477945297272680c750149Daniel Vetter                   (i915->fs->constant_flags[i] == I915_CONSTFLAG_USER
394179cb587954ff90efa477945297272680c750149Daniel Vetter                    ? "user" : "immediate"));
395179cb587954ff90efa477945297272680c750149Daniel Vetter         }
396179cb587954ff90efa477945297272680c750149Daniel Vetter#endif
397179cb587954ff90efa477945297272680c750149Daniel Vetter         OUT_BATCH(*c++);
398179cb587954ff90efa477945297272680c750149Daniel Vetter         OUT_BATCH(*c++);
399179cb587954ff90efa477945297272680c750149Daniel Vetter         OUT_BATCH(*c++);
400179cb587954ff90efa477945297272680c750149Daniel Vetter         OUT_BATCH(*c++);
401179cb587954ff90efa477945297272680c750149Daniel Vetter      }
402179cb587954ff90efa477945297272680c750149Daniel Vetter   }
403179cb587954ff90efa477945297272680c750149Daniel Vetter}
404179cb587954ff90efa477945297272680c750149Daniel Vetter
405179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
406179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_program(struct i915_context *i915, unsigned *batch_space)
407179cb587954ff90efa477945297272680c750149Daniel Vetter{
40845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   uint additional_size = 0, i;
40945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
41045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   additional_size += i915->current.target_fixup_format ? 3 : 0;
41126e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin
41245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   for (i = 0 ; i < i915->fs->program_len; i+=3)
41345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      if ( is_tex_instruction(i915->fs->program + i) &&
41445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin           i915->current.sampler_srgb[tex_sampler(i915->fs->program+i)] )
41545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin         additional_size += 3 * 8 /* 8 instructions for srgb emulation */;
41645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
41745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   /* we need more batch space if we want to emulate rgba framebuffers
41845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin    * or sRGB textures */
41945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   *batch_space = i915->fs->decl_len + i915->fs->program_len + additional_size;
42045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin}
42145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
42245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic void emit_instruction(struct i915_context *i915,
42345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin                             int op,
42445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin                             int dst_mask,
42545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin			     int dst_reg,
42645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin                             int src0_reg,
42745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin                             int src1_reg,
42845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin                             int src2_reg)
42945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{
43045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   OUT_BATCH(op |
43145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin             dst_mask |
43245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin             0 | /* saturate */
43345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin             A0_DEST(dst_reg) |
43445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin             A0_SRC0(src0_reg)
43545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin             );
43645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   OUT_BATCH(A1_SRC0(src0_reg) | A1_SRC1(src1_reg));
43745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   OUT_BATCH(A2_SRC1(src1_reg) | A2_SRC2(src2_reg));
43845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin}
43945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
44045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic void
44145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinemit_srgb_fixup(struct i915_context *i915,
44245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin                uint *program)
44345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{
44445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int dst_reg =
44545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin       (program[0] & UREG_TYPE_NR_MASK) >> UREG_A0_DEST_SHIFT_LEFT;
44645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int dst_mask = program[0] & A0_DEST_CHANNEL_ALL;
44745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int cst_idx = i915->current.srgb_const_offset;
44845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int cst0_reg = swizzle(UREG(REG_TYPE_CONST, cst_idx), X, X, X, X);
44945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int cst1_reg = swizzle(UREG(REG_TYPE_CONST, cst_idx), Y, Y, Y, Y);
45045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int cst2_reg = swizzle(UREG(REG_TYPE_CONST, cst_idx), Z, Z, Z, Z);
45145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int t1_reg = UREG(REG_TYPE_R, 1);
45245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int t1x_reg = swizzle(UREG(REG_TYPE_R, 1), X, X, X, X);
45345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int t1y_reg = swizzle(UREG(REG_TYPE_R, 1), Y, Y, Y, Y);
45445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   int t1z_reg = swizzle(UREG(REG_TYPE_R, 1), Z, Z, Z, Z);
45545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
45645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_MAD, A0_DEST_CHANNEL_ALL, t1_reg, dst_reg, cst0_reg, cst1_reg);
45745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_LOG, A0_DEST_CHANNEL_X, t1_reg, t1x_reg, 0, 0);
45845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_LOG, A0_DEST_CHANNEL_Y, t1_reg, t1y_reg, 0, 0);
45945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_LOG, A0_DEST_CHANNEL_Z, t1_reg, t1z_reg, 0, 0);
46045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_MUL, A0_DEST_CHANNEL_ALL, t1_reg, t1_reg, cst2_reg, 0);
46145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_EXP, dst_mask & A0_DEST_CHANNEL_X, dst_reg, t1x_reg, 0, 0);
46245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_EXP, dst_mask & A0_DEST_CHANNEL_Y, dst_reg, t1y_reg, 0, 0);
46345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   emit_instruction(i915, A0_EXP, dst_mask & A0_DEST_CHANNEL_Z, dst_reg, t1z_reg, 0, 0);
464179cb587954ff90efa477945297272680c750149Daniel Vetter}
465179cb587954ff90efa477945297272680c750149Daniel Vetter
466179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
467179cb587954ff90efa477945297272680c750149Daniel Vetteremit_program(struct i915_context *i915)
468179cb587954ff90efa477945297272680c750149Daniel Vetter{
46945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   uint additional_size = 0;
47026e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin   uint i;
471465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin
47245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   /* count how much additional space we'll need */
47345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   validate_program(i915, &additional_size);
47445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   additional_size -= i915->fs->decl_len + i915->fs->program_len;
47545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
476465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin   /* we should always have, at least, a pass-through program */
477465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin   assert(i915->fs->program_len > 0);
478465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin
4798e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin   /* output the declarations */
48026e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin   {
48126e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin      /* first word has the size, we have to adjust that */
4828e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin      uint size = (i915->fs->decl[0]);
48345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      size += additional_size;
48426e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin      OUT_BATCH(size);
485a9cb01f35597797a83ac940b0230a8f74f99a1b8Stéphane Marchesin   }
486a9cb01f35597797a83ac940b0230a8f74f99a1b8Stéphane Marchesin
4878e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin   for (i = 1 ; i < i915->fs->decl_len; i++)
4888e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin      OUT_BATCH(i915->fs->decl[i]);
4898e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin
4908e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin   /* output the program */
49145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   assert(i915->fs->program_len % 3 == 0);
49245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   for (i = 0 ; i < i915->fs->program_len; i+=3) {
49326e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin      OUT_BATCH(i915->fs->program[i]);
49445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      OUT_BATCH(i915->fs->program[i+1]);
49545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      OUT_BATCH(i915->fs->program[i+2]);
49645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
49745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      /* TEX fixup for sRGB */
49845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin      if ( is_tex_instruction(i915->fs->program+i) &&
49945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin           i915->current.sampler_srgb[tex_sampler(i915->fs->program+i)] )
50045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin         emit_srgb_fixup(i915, i915->fs->program);
50145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin
50245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   }
50326e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin
50426e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin   /* we emit an additional mov with swizzle to fake RGBA framebuffers */
50545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   if (i915->current.target_fixup_format) {
50626e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin      /* mov out_color, out_color.zyxw */
50726e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin      OUT_BATCH(A0_MOV |
50826e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin                (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) |
50926e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin                A0_DEST_CHANNEL_ALL |
51026e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin                (REG_TYPE_OC << A0_SRC0_TYPE_SHIFT) |
51126e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin                (T_DIFFUSE << A0_SRC0_NR_SHIFT));
512305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter      OUT_BATCH(i915->current.fixup_swizzle);
51326e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin      OUT_BATCH(0);
514465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin   }
515179cb587954ff90efa477945297272680c750149Daniel Vetter}
516179cb587954ff90efa477945297272680c750149Daniel Vetter
517179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void
518179cb587954ff90efa477945297272680c750149Daniel Vetteremit_draw_rect(struct i915_context *i915)
519179cb587954ff90efa477945297272680c750149Daniel Vetter{
520288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   if (i915->static_dirty & I915_DST_RECT) {
521288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
522288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      OUT_BATCH(DRAW_RECT_DIS_DEPTH_OFS);
523288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      OUT_BATCH(i915->current.draw_offset);
524288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      OUT_BATCH(i915->current.draw_size);
525288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter      OUT_BATCH(i915->current.draw_offset);
526288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   }
527179cb587954ff90efa477945297272680c750149Daniel Vetter}
528342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
529342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic boolean
530d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetteri915_validate_state(struct i915_context *i915, unsigned *batch_space)
531342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{
532179cb587954ff90efa477945297272680c750149Daniel Vetter   unsigned tmp;
533342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
534342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   i915->num_validation_buffers = 0;
535179cb587954ff90efa477945297272680c750149Daniel Vetter   if (i915->hardware_dirty & I915_HW_INVARIANT)
536179cb587954ff90efa477945297272680c750149Daniel Vetter      *batch_space = Elements(invariant_state);
537179cb587954ff90efa477945297272680c750149Daniel Vetter   else
538179cb587954ff90efa477945297272680c750149Daniel Vetter      *batch_space = 0;
539179cb587954ff90efa477945297272680c750149Daniel Vetter
540633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#if 0
541633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesinstatic int counter_total = 0;
542633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#define VALIDATE_ATOM(atom, hw_dirty) \
543633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin   if (i915->hardware_dirty & hw_dirty) { \
544633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin      static int counter_##atom = 0;\
545633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin      validate_##atom(i915, &tmp); \
546633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin      *batch_space += tmp;\
547633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin      counter_##atom += tmp;\
548633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin      counter_total += tmp;\
549633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin      printf("%s: \t%d/%d \t%2.2f\n",#atom, counter_##atom, counter_total, counter_##atom*100.f/counter_total);}
550633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#else
551179cb587954ff90efa477945297272680c750149Daniel Vetter#define VALIDATE_ATOM(atom, hw_dirty) \
552179cb587954ff90efa477945297272680c750149Daniel Vetter   if (i915->hardware_dirty & hw_dirty) { \
553179cb587954ff90efa477945297272680c750149Daniel Vetter      validate_##atom(i915, &tmp); \
554179cb587954ff90efa477945297272680c750149Daniel Vetter      *batch_space += tmp; }
555633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#endif
556179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(flush, I915_HW_FLUSH);
557179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(immediate, I915_HW_IMMEDIATE);
558179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(dynamic, I915_HW_DYNAMIC);
559179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(static, I915_HW_STATIC);
560179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(map, I915_HW_MAP);
561179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(sampler, I915_HW_SAMPLER);
562179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(constants, I915_HW_CONSTANTS);
563179cb587954ff90efa477945297272680c750149Daniel Vetter   VALIDATE_ATOM(program, I915_HW_PROGRAM);
564179cb587954ff90efa477945297272680c750149Daniel Vetter#undef VALIDATE_ATOM
565342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
566342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   if (i915->num_validation_buffers == 0)
567342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      return TRUE;
568342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
569342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   if (!i915_winsys_validate_buffers(i915->batch, i915->validation_buffers,
570179cb587954ff90efa477945297272680c750149Daniel Vetter                                     i915->num_validation_buffers))
571342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      return FALSE;
572342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
573342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   return TRUE;
574342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter}
57501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
57601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/* Push the state into the sarea and/or texture memory.
57701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */
57801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellvoid
57901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwelli915_emit_hardware_state(struct i915_context *i915 )
58001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
581d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   unsigned batch_space;
582abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz   uintptr_t save_ptr;
583abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz
5849070879a79c3400f08a0b136d8472a7625680ca1Daniel Vetter   assert(i915->dirty == 0);
5859070879a79c3400f08a0b136d8472a7625680ca1Daniel Vetter
586abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz   if (I915_DBG_ON(DBG_ATOMS))
587abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz      i915_dump_hardware_dirty(i915, __FUNCTION__);
588abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz
589d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter   if (!i915_validate_state(i915, &batch_space)) {
590342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter      FLUSH_BATCH(NULL);
591d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter      assert(i915_validate_state(i915, &batch_space));
592342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter   }
593342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter
5948f9e546fde27db75ea87bcf8ae333bc70616deb4Daniel Vetter   if(!BEGIN_BATCH(batch_space)) {
5954abe1eb980ed76d2b2d3383eaab520d0aa2ae6f4Michel Dänzer      FLUSH_BATCH(NULL);
596d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter      assert(i915_validate_state(i915, &batch_space));
5978f9e546fde27db75ea87bcf8ae333bc70616deb4Daniel Vetter      assert(BEGIN_BATCH(batch_space));
59854be3a7added5b6675a78f6df711d3bebc4c6cd5José Fonseca   }
59901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
600abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz   save_ptr = (uintptr_t)i915->batch->ptr;
601abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz
602179cb587954ff90efa477945297272680c750149Daniel Vetter#define EMIT_ATOM(atom, hw_dirty) \
603179cb587954ff90efa477945297272680c750149Daniel Vetter   if (i915->hardware_dirty & hw_dirty) \
604179cb587954ff90efa477945297272680c750149Daniel Vetter      emit_##atom(i915);
605179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(flush, I915_HW_FLUSH);
606179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(invariant, I915_HW_INVARIANT);
607179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(immediate, I915_HW_IMMEDIATE);
608179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(dynamic, I915_HW_DYNAMIC);
609179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(static, I915_HW_STATIC);
610179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(map, I915_HW_MAP);
611179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(sampler, I915_HW_SAMPLER);
612179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(constants, I915_HW_CONSTANTS);
613179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(program, I915_HW_PROGRAM);
614179cb587954ff90efa477945297272680c750149Daniel Vetter   EMIT_ATOM(draw_rect, I915_HW_STATIC);
615179cb587954ff90efa477945297272680c750149Daniel Vetter#undef EMIT_ATOM
61694fda5695e3e05d93dfa20e8d193c2a784c2ae65Keith Whitwell
617ee7acf6493e934dbc78d98738195a3804c23722eDaniel Vetter   I915_DBG(DBG_EMIT, "%s: used %d dwords, %d dwords reserved\n", __FUNCTION__,
618abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz            ((uintptr_t)i915->batch->ptr - save_ptr) / 4,
619ee7acf6493e934dbc78d98738195a3804c23722eDaniel Vetter            batch_space);
620ee7acf6493e934dbc78d98738195a3804c23722eDaniel Vetter   assert(((uintptr_t)i915->batch->ptr - save_ptr) / 4 == batch_space);
62194fda5695e3e05d93dfa20e8d193c2a784c2ae65Keith Whitwell
622e23966f3de81342f7bd11f1e79c04022b5f0193fKeith Whitwell   i915->hardware_dirty = 0;
623b9baad2aff6ddc5145d91cbfb81d083a21990a80Jakob Bornecrantz   i915->immediate_dirty = 0;
6248fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   i915->dynamic_dirty = 0;
625288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter   i915->static_dirty = 0;
626179cb587954ff90efa477945297272680c750149Daniel Vetter   i915->flush_dirty = 0;
62701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
628