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 "main/mtypes.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/samplerobj.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/prog_parameter.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_mipmap_tree.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_batchbuffer.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_tex.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_fbo.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_buffer_objects.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_wm.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_tex_target(GLenum target)
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY_EXT:
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_1D;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE_NV:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_2D;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D_ARRAY_EXT:
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_EXTERNAL_OES:
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_2D;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_3D;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_CUBE;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct surface_format_info {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool exists;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int sampling;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int filtering;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int shadow_compare;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int chroma_key;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int render_target;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int alpha_blend;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int input_vb;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int streamed_output_vb;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int color_processing;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This macro allows us to write the table almost as it appears in the PRM,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * while restructuring it to turn it into the C code we want.
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SF(sampl, filt, shad, ck, rt, ab, vb, so, color, sf) \
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [sf] = { true, sampl, filt, shad, ck, rt, ab, vb, so, color },
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Y 0
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define x 999
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the table of support for surface (texture, renderbuffer, and vertex
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer, but not depthbuffer) formats across the various hardware generations.
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The table is formatted to match the documentation, except that the docs have
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this ridiculous mapping of Y[*+~^#&] for "supported on DevWhatever".  To put
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it in our table, here's the mapping:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Y*: 45
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Y+: 45 (g45/gm45)
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Y~: 50 (gen5)
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Y^: 60 (gen6)
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Y#: 70 (gen7)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See page 88 of the Sandybridge PRM VOL4_Part1 PDF.
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct surface_format_info surface_formats[] = {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* smpl filt shad CK  RT  AB  VB  SO  color */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  Y,  Y,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32B32A32_FLOAT)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32B32A32_SINT)
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32B32A32_UINT)
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32A32_UNORM)
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32A32_SNORM)
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R64G64_FLOAT)
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R32G32B32X32_FLOAT)
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32A32_SSCALED)
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32A32_USCALED)
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  x,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32B32_FLOAT)
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  x,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32B32_SINT)
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  x,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32B32_UINT)
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32_UNORM)
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32_SNORM)
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32_SSCALED)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32B32_USCALED)
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y, 45,  Y,  x, 60, BRW_SURFACEFORMAT_R16G16B16A16_UNORM)
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16A16_SNORM)
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16A16_SINT)
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16A16_UINT)
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16A16_FLOAT)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  Y,  Y,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32_FLOAT)
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32_SINT)
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32G32_UINT)
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_X32_TYPELESS_G8X24_UINT)
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L32A32_FLOAT)
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32_UNORM)
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32_SNORM)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R64_FLOAT)
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R16G16B16X16_UNORM)
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R16G16B16X16_FLOAT)
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_A32X32_FLOAT)
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L32X32_FLOAT)
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_I32X32_FLOAT)
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16A16_SSCALED)
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16A16_USCALED)
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32_SSCALED)
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32G32_USCALED)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y,  Y,  Y,  x, 60, BRW_SURFACEFORMAT_B8G8R8A8_UNORM)
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* smpl filt shad CK  RT  AB  VB  SO  color */
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x, 60, BRW_SURFACEFORMAT_R10G10B10A2_UNORM)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x, 60, BRW_SURFACEFORMAT_R10G10B10A2_UNORM_SRGB)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R10G10B10A2_UINT)
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  Y,  Y,  x,  x, BRW_SURFACEFORMAT_R10G10B10_SNORM_A2_UNORM)
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x, 60, BRW_SURFACEFORMAT_R8G8B8A8_UNORM)
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  x,  x, 60, BRW_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB)
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8A8_SNORM)
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8A8_SINT)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8A8_UINT)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y, 45,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16_UNORM)
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16_SNORM)
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16_SINT)
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16_UINT)
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16_FLOAT)
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  x,  x, 60, BRW_SURFACEFORMAT_B10G10R10A2_UNORM)
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  x,  x, 60, BRW_SURFACEFORMAT_B10G10R10A2_UNORM_SRGB)
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, BRW_SURFACEFORMAT_R11G11B10_FLOAT)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32_SINT)
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, BRW_SURFACEFORMAT_R32_UINT)
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  Y,  Y,  Y,  Y,  x, BRW_SURFACEFORMAT_R32_FLOAT)
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_X24_TYPELESS_G8_UINT)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L16A16_UNORM)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_I24X8_UNORM)
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L24X8_UNORM)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_A24X8_UNORM)
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_I32_FLOAT)
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L32_FLOAT)
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_A32_FLOAT)
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  x,  x,  x,  x, 60, BRW_SURFACEFORMAT_B8G8R8X8_UNORM)
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_B8G8R8X8_UNORM_SRGB)
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R8G8B8X8_UNORM)
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP)
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_B10G10R10X2_UNORM)
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L16A16_FLOAT)
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32_UNORM)
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32_SNORM)
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* smpl filt shad CK  RT  AB  VB  SO  color */
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R10G10B10X2_USCALED)
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8A8_SSCALED)
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8A8_USCALED)
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16_SSCALED)
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16_USCALED)
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32_SSCALED)
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R32_USCALED)
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B5G6R5_UNORM)
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B5G6R5_UNORM_SRGB)
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B5G5R5A1_UNORM)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B5G5R5A1_UNORM_SRGB)
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B4G4R4A4_UNORM)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B4G4R4A4_UNORM_SRGB)
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8_UNORM)
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y, 60,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8_SNORM)
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8_SINT)
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8_UINT)
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  Y,  x,  Y, 45,  Y,  x, 70, BRW_SURFACEFORMAT_R16_UNORM)
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, BRW_SURFACEFORMAT_R16_SNORM)
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16_SINT)
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16_UINT)
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, BRW_SURFACEFORMAT_R16_FLOAT)
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_I16_UNORM)
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L16_UNORM)
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_A16_UNORM)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L8A8_UNORM)
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_I16_FLOAT)
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L16_FLOAT)
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_A16_FLOAT)
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF(45, 45,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L8A8_UNORM_SRGB)
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R5G5_SNORM_B6_UNORM)
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B5G5R5X1_UNORM)
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_B5G5R5X1_UNORM_SRGB)
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8_SSCALED)
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8_USCALED)
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* smpl filt shad CK  RT  AB  VB  SO  color */
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16_SSCALED)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16_USCALED)
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x, 45,  Y,  Y,  Y,  x,  x, BRW_SURFACEFORMAT_R8_UNORM)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, BRW_SURFACEFORMAT_R8_SNORM)
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8_SINT)
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8_UINT)
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, BRW_SURFACEFORMAT_A8_UNORM)
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_I8_UNORM)
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L8_UNORM)
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_P4A4_UNORM)
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_A4P4_UNORM)
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8_SSCALED)
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8_USCALED)
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF(45, 45,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_L8_UNORM_SRGB)
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF(45, 45,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_DXT1_RGB_SRGB)
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_R1_UINT)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y,  x,  x,  x, 60, BRW_SURFACEFORMAT_YCRCB_NORMAL)
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  Y,  x,  x,  x, 60, BRW_SURFACEFORMAT_YCRCB_SWAPUVY)
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC1_UNORM)
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC2_UNORM)
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC3_UNORM)
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC4_UNORM)
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC5_UNORM)
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC1_UNORM_SRGB)
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC2_UNORM_SRGB)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC3_UNORM_SRGB)
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  x,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_MONO8)
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  x,  x,  x, 60, BRW_SURFACEFORMAT_YCRCB_SWAPUV)
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  Y,  x,  x,  x, 60, BRW_SURFACEFORMAT_YCRCB_SWAPY)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_DXT1_RGB)
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* smpl filt shad CK  RT  AB  VB  SO  color */
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_FXT1)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8_UNORM)
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8_SNORM)
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8_SSCALED)
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R8G8B8_USCALED)
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R64G64B64A64_FLOAT)
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R64G64B64_FLOAT)
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC4_SNORM)
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BRW_SURFACEFORMAT_BC5_SNORM)
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16_UNORM)
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16_SNORM)
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16_SSCALED)
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, BRW_SURFACEFORMAT_R16G16B16_USCALED)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef x
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef Y
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_format_for_mesa_format(gl_format mesa_format)
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This table is ordered according to the enum ordering in formats.h.  We do
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * expect that enum to be extended without our explicit initialization
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * staying in sync, so we initialize to 0 even though
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * BRW_SURFACEFORMAT_R32G32B32A32_FLOAT happens to also be 0.
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const uint32_t table[MESA_FORMAT_COUNT] =
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA8888] = 0,
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA8888_REV] = BRW_SURFACEFORMAT_R8G8B8A8_UNORM,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ARGB8888] = BRW_SURFACEFORMAT_B8G8R8A8_UNORM,
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ARGB8888_REV] = 0,
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBX8888] = 0,
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBX8888_REV] = BRW_SURFACEFORMAT_R8G8B8X8_UNORM,
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_XRGB8888] = BRW_SURFACEFORMAT_B8G8R8X8_UNORM,
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_XRGB8888_REV] = 0,
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB888] = 0,
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_BGR888] = 0,
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB565] = BRW_SURFACEFORMAT_B5G6R5_UNORM,
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB565_REV] = 0,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ARGB4444] = BRW_SURFACEFORMAT_B4G4R4A4_UNORM,
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ARGB4444_REV] = 0,
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA5551] = 0,
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ARGB1555] = BRW_SURFACEFORMAT_B5G5R5A1_UNORM,
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ARGB1555_REV] = 0,
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_AL44] = 0,
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_AL88] = BRW_SURFACEFORMAT_L8A8_UNORM,
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_AL88_REV] = 0,
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_AL1616] = BRW_SURFACEFORMAT_L16A16_UNORM,
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_AL1616_REV] = 0,
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB332] = 0,
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_A8] = BRW_SURFACEFORMAT_A8_UNORM,
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_A16] = BRW_SURFACEFORMAT_A16_UNORM,
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_L8] = BRW_SURFACEFORMAT_L8_UNORM,
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_L16] = BRW_SURFACEFORMAT_L16_UNORM,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_I8] = BRW_SURFACEFORMAT_I8_UNORM,
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_I16] = BRW_SURFACEFORMAT_I16_UNORM,
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_YCBCR_REV] = BRW_SURFACEFORMAT_YCRCB_NORMAL,
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_YCBCR] = BRW_SURFACEFORMAT_YCRCB_SWAPUVY,
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R8] = BRW_SURFACEFORMAT_R8_UNORM,
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_GR88] = BRW_SURFACEFORMAT_R8G8_UNORM,
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG88] = 0,
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R16] = BRW_SURFACEFORMAT_R16_UNORM,
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG1616] = BRW_SURFACEFORMAT_R16G16_UNORM,
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG1616_REV] = 0,
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ARGB2101010] = BRW_SURFACEFORMAT_B10G10R10A2_UNORM,
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ABGR2101010_UINT] = BRW_SURFACEFORMAT_R10G10B10A2_UINT,
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_Z24_S8] = 0,
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_S8_Z24] = 0,
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_Z16] = 0,
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_X8_Z24] = 0,
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_Z24_X8] = 0,
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_Z32] = 0,
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_S8] = 0,
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SRGB8] = 0,
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SRGBA8] = 0,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SARGB8] = BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SL8] = BRW_SURFACEFORMAT_L8_UNORM_SRGB,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SLA8] = BRW_SURFACEFORMAT_L8A8_UNORM_SRGB,
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SRGB_DXT1] = BRW_SURFACEFORMAT_DXT1_RGB_SRGB,
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SRGBA_DXT1] = BRW_SURFACEFORMAT_BC1_UNORM_SRGB,
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SRGBA_DXT3] = BRW_SURFACEFORMAT_BC2_UNORM_SRGB,
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SRGBA_DXT5] = BRW_SURFACEFORMAT_BC3_UNORM_SRGB,
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_FXT1] = BRW_SURFACEFORMAT_FXT1,
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_FXT1] = BRW_SURFACEFORMAT_FXT1,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_DXT1] = BRW_SURFACEFORMAT_DXT1_RGB,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_DXT1] = BRW_SURFACEFORMAT_BC1_UNORM,
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_DXT3] = BRW_SURFACEFORMAT_BC2_UNORM,
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_DXT5] = BRW_SURFACEFORMAT_BC3_UNORM,
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_FLOAT32] = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT,
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_FLOAT16] = BRW_SURFACEFORMAT_R16G16B16A16_FLOAT,
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_FLOAT32] = 0,
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_FLOAT16] = 0,
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_FLOAT32] = BRW_SURFACEFORMAT_A32_FLOAT,
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_FLOAT16] = BRW_SURFACEFORMAT_A16_FLOAT,
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_FLOAT32] = BRW_SURFACEFORMAT_L32_FLOAT,
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_FLOAT16] = BRW_SURFACEFORMAT_L16_FLOAT,
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = BRW_SURFACEFORMAT_L32A32_FLOAT,
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = BRW_SURFACEFORMAT_L16A16_FLOAT,
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_FLOAT32] = BRW_SURFACEFORMAT_I32_FLOAT,
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_FLOAT16] = BRW_SURFACEFORMAT_I16_FLOAT,
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_FLOAT32] = BRW_SURFACEFORMAT_R32_FLOAT,
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_FLOAT16] = BRW_SURFACEFORMAT_R16_FLOAT,
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_FLOAT32] = BRW_SURFACEFORMAT_R32G32_FLOAT,
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_FLOAT16] = BRW_SURFACEFORMAT_R16G16_FLOAT,
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_UINT8] = 0,
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_UINT16] = 0,
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_UINT32] = 0,
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_INT8] = 0,
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_INT16] = 0,
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_ALPHA_INT32] = 0,
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_UINT8] = 0,
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_UINT16] = 0,
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_UINT32] = 0,
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_INT8] = 0,
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_INT16] = 0,
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_INTENSITY_INT32] = 0,
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_UINT8] = 0,
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_UINT16] = 0,
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_UINT32] = 0,
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_INT8] = 0,
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_INT16] = 0,
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_INT32] = 0,
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = 0,
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = 0,
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = 0,
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_INT8] = 0,
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_INT16] = 0,
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LUMINANCE_ALPHA_INT32] = 0,
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_INT8] = BRW_SURFACEFORMAT_R8_SINT,
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_INT8] = BRW_SURFACEFORMAT_R8G8_SINT,
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_INT8] = 0,
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_INT8] = BRW_SURFACEFORMAT_R8G8B8A8_SINT,
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_INT16] = BRW_SURFACEFORMAT_R16_SINT,
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_INT16] = BRW_SURFACEFORMAT_R16G16_SINT,
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_INT16] = 0,
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_INT16] = BRW_SURFACEFORMAT_R16G16B16A16_SINT,
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_INT32] = BRW_SURFACEFORMAT_R32_SINT,
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_INT32] = BRW_SURFACEFORMAT_R32G32_SINT,
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_INT32] = BRW_SURFACEFORMAT_R32G32B32_SINT,
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_INT32] = BRW_SURFACEFORMAT_R32G32B32A32_SINT,
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_UINT8] = BRW_SURFACEFORMAT_R8_UINT,
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_UINT8] = BRW_SURFACEFORMAT_R8G8_UINT,
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_UINT8] = 0,
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_UINT8] = BRW_SURFACEFORMAT_R8G8B8A8_UINT,
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_UINT16] = BRW_SURFACEFORMAT_R16_UINT,
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_UINT16] = BRW_SURFACEFORMAT_R16G16_UINT,
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_UINT16] = 0,
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_UINT16] = BRW_SURFACEFORMAT_R16G16B16A16_UINT,
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R_UINT32] = BRW_SURFACEFORMAT_R32_UINT,
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_UINT32] = BRW_SURFACEFORMAT_R32G32_UINT,
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB_UINT32] = BRW_SURFACEFORMAT_R32G32B32_UINT,
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_UINT32] = BRW_SURFACEFORMAT_R32G32B32A32_UINT,
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_DUDV8] = BRW_SURFACEFORMAT_R8G8_SNORM,
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_R8] = BRW_SURFACEFORMAT_R8_SNORM,
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RG88_REV] = BRW_SURFACEFORMAT_R8G8_SNORM,
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RGBX8888] = 0,
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RGBA8888] = 0,
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RGBA8888_REV] = BRW_SURFACEFORMAT_R8G8B8A8_SNORM,
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_R16] = BRW_SURFACEFORMAT_R16_SNORM,
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_GR1616] = BRW_SURFACEFORMAT_R16G16_SNORM,
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RGB_16] = 0,
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RGBA_16] = BRW_SURFACEFORMAT_R16G16B16A16_SNORM,
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGBA_16] = BRW_SURFACEFORMAT_R16G16B16A16_UNORM,
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RED_RGTC1] = BRW_SURFACEFORMAT_BC4_UNORM,
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RED_RGTC1] = BRW_SURFACEFORMAT_BC4_SNORM,
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RG_RGTC2] = BRW_SURFACEFORMAT_BC5_UNORM,
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_RG_RGTC2] = BRW_SURFACEFORMAT_BC5_SNORM,
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_L_LATC1] = 0,
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_L_LATC1] = 0,
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_LA_LATC2] = 0,
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_LA_LATC2] = 0,
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_A8] = 0,
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_L8] = 0,
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_AL88] = 0,
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_I8] = 0,
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_A16] = 0,
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_L16] = 0,
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_AL1616] = 0,
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_SIGNED_I16] = 0,
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_RGB9_E5_FLOAT] = BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP,
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_R11_G11_B10_FLOAT] = BRW_SURFACEFORMAT_R11G11B10_FLOAT,
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_Z32_FLOAT] = 0,
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      [MESA_FORMAT_Z32_FLOAT_X24S8] = 0,
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   };
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mesa_format < MESA_FORMAT_COUNT);
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return table[mesa_format];
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_init_surface_formats(struct brw_context *brw)
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int gen;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format format;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gen = intel->gen * 10;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->is_g4x)
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gen += 5;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (format = MESA_FORMAT_NONE + 1; format < MESA_FORMAT_COUNT; format++) {
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t texture, render;
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct surface_format_info *rinfo, *tinfo;
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool is_integer = _mesa_is_format_integer_color(format);
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      render = texture = brw_format_for_mesa_format(format);
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tinfo = &surface_formats[texture];
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The value of BRW_SURFACEFORMAT_R32G32B32A32_FLOAT is 0, so don't skip
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * it.
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texture == 0 && format != MESA_FORMAT_RGBA_FLOAT32)
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 continue;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (gen >= tinfo->sampling && (gen >= tinfo->filtering || is_integer))
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ctx->TextureFormatSupported[format] = true;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Re-map some render target formats to make them supported when they
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * wouldn't be using their format for texturing.
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (render) {
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* For these formats, we just need to read/write the first
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * channel into R, which is to say that we just treat them as
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * GL_RED.
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case BRW_SURFACEFORMAT_I32_FLOAT:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case BRW_SURFACEFORMAT_L32_FLOAT:
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 render = BRW_SURFACEFORMAT_R32_FLOAT;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case BRW_SURFACEFORMAT_I16_FLOAT:
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case BRW_SURFACEFORMAT_L16_FLOAT:
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 render = BRW_SURFACEFORMAT_R16_FLOAT;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case BRW_SURFACEFORMAT_B8G8R8X8_UNORM:
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* XRGB is handled as ARGB because the chips in this family
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * cannot render to XRGB targets.  This means that we have to
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * mask writes to alpha (ala glColorMask) and reconfigure the
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * alpha blending hardware to use GL_ONE (or GL_ZERO) for
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * cases where GL_DST_ALPHA (or GL_ONE_MINUS_DST_ALPHA) is
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * used.
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 render = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rinfo = &surface_formats[render];
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Note that GL_EXT_texture_integer says that blending doesn't occur for
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * integer, so we don't need hardware support for blending on it.  Other
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * than that, GL in general requires alpha blending for render targets,
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * even though we don't support it for some formats.
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (gen >= rinfo->render_target &&
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (gen >= rinfo->alpha_blend || is_integer)) {
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw->render_target_format[format] = render;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw->format_supported_as_render_target[format] = true;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* We will check this table for FBO completeness, but the surface format
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * table above only covered color rendering.
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->format_supported_as_render_target[MESA_FORMAT_S8_Z24] = true;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->format_supported_as_render_target[MESA_FORMAT_X8_Z24] = true;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->format_supported_as_render_target[MESA_FORMAT_S8] = true;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->format_supported_as_render_target[MESA_FORMAT_Z16] = true;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->format_supported_as_render_target[MESA_FORMAT_Z32_FLOAT] = true;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->format_supported_as_render_target[MESA_FORMAT_Z32_FLOAT_X24S8] = true;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* We remap depth formats to a supported texturing format in
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * translate_tex_format().
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->TextureFormatSupported[MESA_FORMAT_S8_Z24] = true;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->TextureFormatSupported[MESA_FORMAT_X8_Z24] = true;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT] = true;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8] = true;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->TextureFormatSupported[MESA_FORMAT_Z16] = true;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* On hardware that lacks support for ETC1, we map ETC1 to RGBX
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * during glCompressedTexImage2D(). See intel_mipmap_tree::wraps_etc1.
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->TextureFormatSupported[MESA_FORMAT_ETC1_RGB8] = true;
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_render_target_supported(struct intel_context *intel,
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    struct gl_renderbuffer *rb)
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_context *brw = brw_context(&intel->ctx);
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format format = rb->Format;
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Many integer formats are promoted to RGBA (like XRGB8888 is), which means
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * we would consider them renderable even though we don't have surface
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * support for their alpha behavior and don't have the blending unit
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * available to fake it like we do for XRGB8888.  Force them to being
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * unsupported.
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((rb->_BaseFormat != GL_RGBA &&
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rb->_BaseFormat != GL_RG &&
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rb->_BaseFormat != GL_RED) && _mesa_is_format_integer_color(format))
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Under some conditions, MSAA is not supported for formats whose width is
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * more than 64 bits.
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rb->NumSamples > 0 && _mesa_get_format_bytes(format) > 8) {
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Gen6: MSAA on >64 bit formats is unsupported. */
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (intel->gen <= 6)
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Gen7: 8x MSAA on >64 bit formats is unsupported. */
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (rb->NumSamples >= 8)
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return brw->format_supported_as_render_target[format];
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_tex_format(gl_format mesa_format,
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLenum internal_format,
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLenum depth_mode,
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLenum srgb_decode)
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srgb_decode == GL_SKIP_DECODE_EXT)
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mesa_format = _mesa_get_srgb_format_linear(mesa_format);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch( mesa_format ) {
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_Z16:
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACEFORMAT_I16_UNORM;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_S8_Z24:
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_X8_Z24:
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACEFORMAT_I24X8_UNORM;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_Z32_FLOAT:
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACEFORMAT_I32_FLOAT;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_Z32_FLOAT_X24S8:
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACEFORMAT_R32G32_FLOAT;
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_FLOAT32:
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The value of this BRW_SURFACEFORMAT is 0, which tricks the
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * assertion below.
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACEFORMAT_R32G32B32A32_FLOAT;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(brw_format_for_mesa_format(mesa_format) != 0);
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return brw_format_for_mesa_format(mesa_format);
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_get_surface_tiling_bits(uint32_t tiling)
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (tiling) {
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case I915_TILING_X:
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_TILED;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case I915_TILING_Y:
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_TILED | BRW_SURFACE_TILED_Y;
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_get_surface_num_multisamples(unsigned num_samples)
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_samples > 1)
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_MULTISAMPLECOUNT_4;
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BRW_SURFACE_MULTISAMPLECOUNT_1;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute the combination of DEPTH_TEXTURE_MODE and EXT_texture_swizzle
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swizzling.
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_get_texture_swizzle(const struct gl_texture_object *t)
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int swizzles[SWIZZLE_NIL + 1] = {
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SWIZZLE_X,
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SWIZZLE_Y,
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SWIZZLE_Z,
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SWIZZLE_W,
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SWIZZLE_ZERO,
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SWIZZLE_ONE,
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SWIZZLE_NIL
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   };
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (img->_BaseFormat == GL_DEPTH_COMPONENT ||
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       img->_BaseFormat == GL_DEPTH_STENCIL) {
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (t->DepthMode) {
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA:
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[0] = SWIZZLE_ZERO;
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[1] = SWIZZLE_ZERO;
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[2] = SWIZZLE_ZERO;
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[3] = SWIZZLE_X;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE:
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[0] = SWIZZLE_X;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[1] = SWIZZLE_X;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[2] = SWIZZLE_X;
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[3] = SWIZZLE_ONE;
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY:
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[0] = SWIZZLE_X;
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[1] = SWIZZLE_X;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[2] = SWIZZLE_X;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[3] = SWIZZLE_X;
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED:
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[0] = SWIZZLE_X;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[1] = SWIZZLE_ZERO;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[2] = SWIZZLE_ZERO;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         swizzles[3] = SWIZZLE_ONE;
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        swizzles[GET_SWZ(t->_Swizzle, 1)],
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        swizzles[GET_SWZ(t->_Swizzle, 2)],
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        swizzles[GET_SWZ(t->_Swizzle, 3)]);
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_buffer_texture_surface(struct gl_context *ctx,
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  unsigned unit,
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  uint32_t *binding_table,
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  unsigned surf_index)
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_context *brw = brw_context(ctx);
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *surf;
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_buffer_object *intel_obj =
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_buffer_object(tObj->BufferObject);
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bo = intel_obj ? intel_obj->buffer : NULL;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format format = tObj->_BufferObjectFormat;
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t brw_format = brw_format_for_mesa_format(format);
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int texel_size = _mesa_get_format_bytes(format);
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (brw_format == 0 && format != MESA_FORMAT_RGBA_FLOAT32) {
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "bad format %s for texture buffer\n",
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    _mesa_get_format_name(format));
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  6 * 4, 32, &binding_table[surf_index]);
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[0] = (BRW_SURFACE_BUFFER << BRW_SURFACE_TYPE_SHIFT |
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (brw_format_for_mesa_format(format) << BRW_SURFACE_FORMAT_SHIFT));
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen >= 6)
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[0] |= BRW_SURFACE_RC_READ_WRITE;
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bo) {
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[1] = bo->offset; /* reloc */
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit relocation to surface contents. */
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo_emit_reloc(brw->intel.batch.bo,
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      binding_table[surf_index] + 4,
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      bo, 0, I915_GEM_DOMAIN_SAMPLER, 0);
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int w = intel_obj->Base.Size / texel_size;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[2] = ((w & 0x7f) << BRW_SURFACE_WIDTH_SHIFT |
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 ((w >> 7) & 0x1fff) << BRW_SURFACE_HEIGHT_SHIFT);
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[3] = (((w >> 20) & 0x7f) << BRW_SURFACE_DEPTH_SHIFT |
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 (texel_size - 1) << BRW_SURFACE_PITCH_SHIFT);
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[1] = 0;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[2] = 0;
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[3] = 0;
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[4] = 0;
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[5] = 0;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_texture_surface(struct gl_context *ctx,
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned unit,
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           uint32_t *binding_table,
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned surf_index)
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_context *brw = brw_context(ctx);
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_object *intelObj = intel_texture_object(tObj);
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt = intelObj->mt;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *surf;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int width, height, depth;
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tObj->Target == GL_TEXTURE_BUFFER) {
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_update_buffer_texture_surface(ctx, unit, binding_table, surf_index);
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth);
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  6 * 4, 32, &binding_table[surf_index]);
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[0] = (translate_tex_target(tObj->Target) << BRW_SURFACE_TYPE_SHIFT |
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_SURFACE_MIPMAPLAYOUT_BELOW << BRW_SURFACE_MIPLAYOUT_SHIFT |
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_SURFACE_CUBEFACE_ENABLES |
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (translate_tex_format(mt->format,
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    firstImage->InternalFormat,
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    tObj->DepthMode,
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    sampler->sRGBDecode) <<
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       BRW_SURFACE_FORMAT_SHIFT));
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[1] = intelObj->mt->region->bo->offset + intelObj->mt->offset; /* reloc */
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[2] = ((intelObj->_MaxLevel - tObj->BaseLevel) << BRW_SURFACE_LOD_SHIFT |
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (width - 1) << BRW_SURFACE_WIDTH_SHIFT |
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (height - 1) << BRW_SURFACE_HEIGHT_SHIFT);
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[3] = (brw_get_surface_tiling_bits(intelObj->mt->region->tiling) |
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (depth - 1) << BRW_SURFACE_DEPTH_SHIFT |
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      ((intelObj->mt->region->pitch * intelObj->mt->cpp) - 1) <<
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_SURFACE_PITCH_SHIFT);
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[4] = 0;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[5] = (mt->align_h == 4) ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Emit relocation to surface contents */
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   binding_table[surf_index] + 4,
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   intelObj->mt->region->bo,
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           intelObj->mt->offset,
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   I915_GEM_DOMAIN_SAMPLER, 0);
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create the constant buffer surface.  Vertex/fragment shader constants will be
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * read from this buffer with Data Port Read instructions/messages.
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_create_constant_surface(struct brw_context *brw,
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    drm_intel_bo *bo,
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t offset,
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    int width,
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t *out_offset)
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint w = width - 1;
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *surf;
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  6 * 4, 32, out_offset);
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[0] = (BRW_SURFACE_BUFFER << BRW_SURFACE_TYPE_SHIFT |
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_SURFACE_MIPMAPLAYOUT_BELOW << BRW_SURFACE_MIPLAYOUT_SHIFT |
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_SURFACE_FORMAT_SHIFT);
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen >= 6)
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[0] |= BRW_SURFACE_RC_READ_WRITE;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[1] = bo->offset + offset; /* reloc */
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[2] = ((w & 0x7f) << BRW_SURFACE_WIDTH_SHIFT |
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      ((w >> 7) & 0x1fff) << BRW_SURFACE_HEIGHT_SHIFT);
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[3] = (((w >> 20) & 0x7f) << BRW_SURFACE_DEPTH_SHIFT |
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (16 - 1) << BRW_SURFACE_PITCH_SHIFT); /* ignored */
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[4] = 0;
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[5] = 0;
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * bspec ("Data Cache") says that the data cache does not exist as
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a separate cache and is just the sampler cache.
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   *out_offset + 4,
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   bo, offset,
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   I915_GEM_DOMAIN_SAMPLER, 0);
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set up a binding table entry for use by stream output logic (transform
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * feedback).
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer_size_minus_1 must me less than BRW_MAX_NUM_BUFFER_ENTRIES.
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_sol_surface(struct brw_context *brw,
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct gl_buffer_object *buffer_obj,
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       uint32_t *out_offset, unsigned num_vector_components,
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned stride_dwords, unsigned offset_dwords)
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_buffer_object *intel_bo = intel_buffer_object(buffer_obj);
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bo =
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_bufferobj_buffer(intel, intel_bo, INTEL_WRITE_PART);
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 6 * 4, 32,
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    out_offset);
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t pitch_minus_1 = 4*stride_dwords - 1;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t offset_bytes = 4 * offset_dwords;
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t size_dwords = buffer_obj->Size / 4;
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t buffer_size_minus_1, width, height, depth, surface_format;
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* FIXME: can we rely on core Mesa to ensure that the buffer isn't
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * too big to map using a single binding table entry?
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert((size_dwords - offset_dwords) / stride_dwords
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          <= BRW_MAX_NUM_BUFFER_ENTRIES);
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (size_dwords > offset_dwords + num_vector_components) {
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* There is room for at least 1 transform feedback output in the buffer.
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Compute the number of additional transform feedback outputs the
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * buffer has room for.
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffer_size_minus_1 =
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (size_dwords - offset_dwords - num_vector_components) / stride_dwords;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* There isn't even room for a single transform feedback output in the
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * buffer.  We can't configure the binding table entry to prevent output
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * entirely; we'll have to rely on the geometry shader to detect
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * overflow.  But to minimize the damage in case of a bug, set up the
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * binding table entry to just allow a single output.
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffer_size_minus_1 = 0;
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   width = buffer_size_minus_1 & 0x7f;
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   height = (buffer_size_minus_1 & 0xfff80) >> 7;
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   depth = (buffer_size_minus_1 & 0x7f00000) >> 20;
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (num_vector_components) {
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 1:
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_format = BRW_SURFACEFORMAT_R32_FLOAT;
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 2:
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_format = BRW_SURFACEFORMAT_R32G32_FLOAT;
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 3:
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_format = BRW_SURFACEFORMAT_R32G32B32_FLOAT;
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 4:
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_format = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT;
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"Invalid vector size for transform feedback output");
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_format = BRW_SURFACEFORMAT_R32_FLOAT;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[0] = BRW_SURFACE_BUFFER << BRW_SURFACE_TYPE_SHIFT |
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BRW_SURFACE_MIPMAPLAYOUT_BELOW << BRW_SURFACE_MIPLAYOUT_SHIFT |
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_format << BRW_SURFACE_FORMAT_SHIFT |
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BRW_SURFACE_RC_READ_WRITE;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[1] = bo->offset + offset_bytes; /* reloc */
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[2] = (width << BRW_SURFACE_WIDTH_SHIFT |
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      height << BRW_SURFACE_HEIGHT_SHIFT);
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[3] = (depth << BRW_SURFACE_DEPTH_SHIFT |
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              pitch_minus_1 << BRW_SURFACE_PITCH_SHIFT);
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[4] = 0;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[5] = 0;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Emit relocation to surface contents. */
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   *out_offset + 4,
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   bo, offset_bytes,
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER);
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Creates a new WM constant buffer reflecting the current fragment program's
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * constants, if needed by the fragment program.
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise, constants go through the CURBEs using the brw_constant_buffer
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * state atom.
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_wm_pull_constants(struct brw_context *brw)
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &brw->intel.ctx;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* BRW_NEW_FRAGMENT_PROGRAM */
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_fragment_program *fp =
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (struct brw_fragment_program *) brw->fragment_program;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_program_parameter_list *params = fp->program.Base.Parameters;
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int size = brw->wm.prog_data->nr_pull_params * sizeof(float);
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int surf_index = SURF_INDEX_FRAG_CONST_BUFFER;
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *constants;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int i;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_load_state_parameters(ctx, params);
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* CACHE_NEW_WM_PROG */
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (brw->wm.prog_data->nr_pull_params == 0) {
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (brw->wm.const_bo) {
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 drm_intel_bo_unreference(brw->wm.const_bo);
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw->wm.const_bo = NULL;
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw->wm.surf_offset[surf_index] = 0;
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw->state.dirty.brw |= BRW_NEW_SURFACES;
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_unreference(brw->wm.const_bo);
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->wm.const_bo = drm_intel_bo_alloc(intel->bufmgr, "WM const bo",
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 size, 64);
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_PROGRAM_CONSTANTS */
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_gem_bo_map_gtt(brw->wm.const_bo);
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   constants = brw->wm.const_bo->virtual;
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < brw->wm.prog_data->nr_pull_params; i++) {
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      constants[i] = *brw->wm.prog_data->pull_param[i];
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_gem_bo_unmap_gtt(brw->wm.const_bo);
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel->vtbl.create_constant_surface(brw, brw->wm.const_bo, 0,
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       params->NumParameters,
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &brw->wm.surf_offset[surf_index]);
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->state.dirty.brw |= BRW_NEW_SURFACES;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_wm_pull_constants = {
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = (_NEW_PROGRAM_CONSTANTS),
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = (BRW_NEW_BATCH | BRW_NEW_FRAGMENT_PROGRAM),
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = CACHE_NEW_WM_PROG,
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_upload_wm_pull_constants,
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_null_renderbuffer_surface(struct brw_context *brw, unsigned int unit)
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the Sandy bridge PRM, Vol4 Part1 p71 (Surface Type: Programming
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Notes):
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     A null surface will be used in instances where an actual surface is
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     not bound. When a write message is generated to a null surface, no
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     actual surface is written to. When a read message (including any
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     sampling engine message) is generated to a null surface, the result
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     is all zeros. Note that a null surface type is allowed to be used
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     with all messages, even if it is not specificially indicated as
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     supported. All of the remaining fields in surface state are ignored
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     for null surfaces, with the following exceptions:
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     - [DevSNB+]: Width, Height, Depth, and LOD fields must match the
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *       depth buffer’s corresponding state for all render target surfaces,
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *       including null.
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     - Surface Format must be R8G8B8A8_UNORM.
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *surf;
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned surface_type = BRW_SURFACE_NULL;
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bo = NULL;
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned pitch_minus_1 = 0;
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t multisampling_state = 0;
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_BUFFERS */
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_framebuffer *fb = ctx->DrawBuffer;
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  6 * 4, 32, &brw->wm.surf_offset[unit]);
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fb->Visual.samples > 1) {
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* On Gen6, null render targets seem to cause GPU hangs when
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * multisampling.  So work around this problem by rendering into dummy
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * color buffer.
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * To decrease the amount of memory needed by the workaround buffer, we
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * set its pitch to 128 bytes (the width of a Y tile).  This means that
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the amount of memory needed for the workaround buffer is
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * (width_in_tiles + height_in_tiles - 1) tiles.
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Note that since the workaround buffer will be interpreted by the
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * hardware as an interleaved multisampled buffer, we need to compute
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * width_in_tiles and height_in_tiles by dividing the width and height
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * by 16 rather than the normal Y-tile size of 32.
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned width_in_tiles = ALIGN(fb->Width, 16) / 16;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned height_in_tiles = ALIGN(fb->Height, 16) / 16;
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned size_needed = (width_in_tiles + height_in_tiles - 1) * 4096;
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_get_scratch_bo(intel, &brw->wm.multisampled_null_render_target_bo,
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         size_needed);
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bo = brw->wm.multisampled_null_render_target_bo;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_type = BRW_SURFACE_2D;
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pitch_minus_1 = 127;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      multisampling_state =
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         brw_get_surface_num_multisamples(fb->Visual.samples);
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[0] = (surface_type << BRW_SURFACE_TYPE_SHIFT |
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_SURFACEFORMAT_B8G8R8A8_UNORM << BRW_SURFACE_FORMAT_SHIFT);
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen < 6) {
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf[0] |= (1 << BRW_SURFACE_WRITEDISABLE_R_SHIFT |
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  1 << BRW_SURFACE_WRITEDISABLE_G_SHIFT |
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  1 << BRW_SURFACE_WRITEDISABLE_B_SHIFT |
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  1 << BRW_SURFACE_WRITEDISABLE_A_SHIFT);
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[1] = bo ? bo->offset : 0;
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[2] = ((fb->Width - 1) << BRW_SURFACE_WIDTH_SHIFT |
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              (fb->Height - 1) << BRW_SURFACE_HEIGHT_SHIFT);
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From Sandy bridge PRM, Vol4 Part1 p82 (Tiled Surface: Programming
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Notes):
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     If Surface Type is SURFTYPE_NULL, this field must be TRUE
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[3] = (BRW_SURFACE_TILED | BRW_SURFACE_TILED_Y |
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              pitch_minus_1 << BRW_SURFACE_PITCH_SHIFT);
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[4] = multisampling_state;
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[5] = 0;
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bo) {
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo_emit_reloc(brw->intel.batch.bo,
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              brw->wm.surf_offset[unit] + 4,
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              bo, 0,
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER);
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sets up a surface state structure to point at the given region.
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * While it is only used for the front/back buffer currently, it should be
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * usable for further buffers when doing ARB_draw_buffer support.
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_renderbuffer_surface(struct brw_context *brw,
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct gl_renderbuffer *rb,
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned int unit)
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_renderbuffer *irb = intel_renderbuffer(rb);
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt = irb->mt;
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_region *region;
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *surf;
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t tile_x, tile_y;
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t format = 0;
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format rb_format = intel_rb_format(irb);
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (irb->tex_image && !brw->has_surface_tile_offset) {
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y);
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tile_x != 0 || tile_y != 0) {
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Original gen4 hardware couldn't draw to a non-tile-aligned
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * destination in a miptree unless you actually setup your renderbuffer
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * as a miptree and used the fragile lod/array_index/etc. controls to
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * select the image.  So, instead, we just make a new single-level
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * miptree and render into that.
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 struct intel_context *intel = intel_context(ctx);
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 struct intel_texture_image *intel_image =
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel_texture_image(irb->tex_image);
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 struct intel_mipmap_tree *new_mt;
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 int width, height, depth;
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_get_dimensions_for_image(irb->tex_image, &width, &height, &depth);
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 new_mt = intel_miptree_create(intel, irb->tex_image->TexObject->Target,
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       intel_image->base.Base.TexFormat,
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       intel_image->base.Base.Level,
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       intel_image->base.Base.Level,
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       width, height, depth,
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       true,
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       0 /* num_samples */,
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       INTEL_MSAA_LAYOUT_NONE);
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_copy_teximage(intel, intel_image, new_mt);
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_reference(&irb->mt, intel_image->mt);
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_renderbuffer_set_draw_offset(irb);
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_release(&new_mt);
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 mt = irb->mt;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   region = irb->mt->region;
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  6 * 4, 32, &brw->wm.surf_offset[unit]);
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (rb_format) {
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_SARGB8:
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* _NEW_BUFFERS
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Without GL_EXT_framebuffer_sRGB we shouldn't bind sRGB surfaces to the
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * blend/update as sRGB.
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Color.sRGBEnabled)
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 format = brw_format_for_mesa_format(rb_format);
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = brw->render_target_format[rb_format];
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(!brw->format_supported_as_render_target[rb_format])) {
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_problem(ctx, "%s: renderbuffer format %s unsupported\n",
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       __FUNCTION__, _mesa_get_format_name(rb_format));
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[0] = (BRW_SURFACE_2D << BRW_SURFACE_TYPE_SHIFT |
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      format << BRW_SURFACE_FORMAT_SHIFT);
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* reloc */
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[1] = (intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y) +
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      region->bo->offset);
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[2] = ((rb->Width - 1) << BRW_SURFACE_WIDTH_SHIFT |
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (rb->Height - 1) << BRW_SURFACE_HEIGHT_SHIFT);
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[3] = (brw_get_surface_tiling_bits(region->tiling) |
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      ((region->pitch * region->cpp) - 1) << BRW_SURFACE_PITCH_SHIFT);
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[4] = brw_get_surface_num_multisamples(mt->num_samples);
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(brw->has_surface_tile_offset || (tile_x == 0 && tile_y == 0));
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note that the low bits of these fields are missing, so
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * there's the possibility of getting in trouble.
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(tile_x % 4 == 0);
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(tile_y % 2 == 0);
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf[5] = ((tile_x / 4) << BRW_SURFACE_X_OFFSET_SHIFT |
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (tile_y / 2) << BRW_SURFACE_Y_OFFSET_SHIFT |
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      (mt->align_h == 4 ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0));
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen < 6) {
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* _NEW_COLOR */
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Color.ColorLogicOpEnabled &&
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (ctx->Color.BlendEnabled & (1 << unit)))
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 surf[0] |= BRW_SURFACE_BLEND_ENABLED;
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Color.ColorMask[unit][0])
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 surf[0] |= 1 << BRW_SURFACE_WRITEDISABLE_R_SHIFT;
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Color.ColorMask[unit][1])
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 surf[0] |= 1 << BRW_SURFACE_WRITEDISABLE_G_SHIFT;
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Color.ColorMask[unit][2])
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 surf[0] |= 1 << BRW_SURFACE_WRITEDISABLE_B_SHIFT;
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* As mentioned above, disable writes to the alpha component when the
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * renderbuffer is XRGB.
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->DrawBuffer->Visual.alphaBits == 0 ||
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  !ctx->Color.ColorMask[unit][3]) {
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 surf[0] |= 1 << BRW_SURFACE_WRITEDISABLE_A_SHIFT;
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   brw->wm.surf_offset[unit] + 4,
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   region->bo,
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   surf[1] - region->bo->offset,
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   I915_GEM_DOMAIN_RENDER,
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   I915_GEM_DOMAIN_RENDER);
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Construct SURFACE_STATE objects for renderbuffers/draw buffers.
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_renderbuffer_surfaces(struct brw_context *brw)
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &brw->intel.ctx;
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_BUFFERS | _NEW_COLOR */
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Update surfaces for drawing buffers */
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->DrawBuffer->_NumColorDrawBuffers >= 1) {
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[i])) {
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel->vtbl.update_renderbuffer_surface(brw, ctx->DrawBuffer->_ColorDrawBuffers[i], i);
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel->vtbl.update_null_renderbuffer_surface(brw, i);
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel->vtbl.update_null_renderbuffer_surface(brw, 0);
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->state.dirty.brw |= BRW_NEW_SURFACES;
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_renderbuffer_surfaces = {
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = (_NEW_COLOR |
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _NEW_BUFFERS),
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = BRW_NEW_BATCH,
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = 0
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_update_renderbuffer_surfaces,
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state gen6_renderbuffer_surfaces = {
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = _NEW_BUFFERS,
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = BRW_NEW_BATCH,
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = 0
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_update_renderbuffer_surfaces,
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Construct SURFACE_STATE objects for enabled textures.
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_update_texture_surfaces(struct brw_context *brw)
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* BRW_NEW_VERTEX_PROGRAM and BRW_NEW_FRAGMENT_PROGRAM:
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unfortunately, we're stuck using the gl_program structs until the
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * ARB_fragment_program front-end gets converted to GLSL IR.  These
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * have the downside that SamplerUnits is split and only contains the
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * mappings for samplers active in that stage.
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_program *vs = (struct gl_program *) brw->vertex_program;
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_program *fs = (struct gl_program *) brw->fragment_program;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned num_samplers = _mesa_fls(vs->SamplersUsed | fs->SamplersUsed);
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned s = 0; s < num_samplers; s++) {
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw->vs.surf_offset[SURF_INDEX_VS_TEXTURE(s)] = 0;
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw->wm.surf_offset[SURF_INDEX_TEXTURE(s)] = 0;
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (vs->SamplersUsed & (1 << s)) {
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const unsigned unit = vs->SamplerUnits[s];
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* _NEW_TEXTURE */
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Texture.Unit[unit]._ReallyEnabled) {
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            intel->vtbl.update_texture_surface(ctx, unit,
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               brw->vs.surf_offset,
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               SURF_INDEX_VS_TEXTURE(s));
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fs->SamplersUsed & (1 << s)) {
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const unsigned unit = fs->SamplerUnits[s];
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* _NEW_TEXTURE */
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Texture.Unit[unit]._ReallyEnabled) {
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            intel->vtbl.update_texture_surface(ctx, unit,
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               brw->wm.surf_offset,
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               SURF_INDEX_TEXTURE(s));
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->state.dirty.brw |= BRW_NEW_SURFACES;
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_texture_surfaces = {
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = _NEW_TEXTURE,
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = BRW_NEW_BATCH |
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             BRW_NEW_VERTEX_PROGRAM |
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             BRW_NEW_FRAGMENT_PROGRAM,
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = 0
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_update_texture_surfaces,
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_ubo_surfaces(struct brw_context *brw,
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct gl_shader *shader,
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t *surf_offsets)
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &brw->intel.ctx;
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!shader)
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < shader->NumUniformBlocks; i++) {
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_uniform_buffer_binding *binding;
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct intel_buffer_object *intel_bo;
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      binding = &ctx->UniformBufferBindings[shader->UniformBlocks[i].Binding];
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_bo = intel_buffer_object(binding->BufferObject);
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo *bo = intel_bufferobj_buffer(intel, intel_bo, INTEL_READ);
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Because behavior for referencing outside of the binding's size in the
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * glBindBufferRange case is undefined, we can just bind the whole buffer
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * glBindBufferBase wants and be a correct implementation.
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int size = bo->size - binding->Offset;
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = ALIGN(size, 16) / 16; /* The interface takes a number of vec4s */
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel->vtbl.create_constant_surface(brw, bo, binding->Offset,
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  size,
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  &surf_offsets[i]);
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (shader->NumUniformBlocks)
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw->state.dirty.brw |= BRW_NEW_SURFACES;
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_wm_ubo_surfaces(struct brw_context *brw)
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &brw->intel.ctx;
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_PROGRAM */
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_shader_program *prog = ctx->Shader._CurrentFragmentProgram;
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!prog)
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_upload_ubo_surfaces(brw, prog->_LinkedShaders[MESA_SHADER_FRAGMENT],
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   &brw->wm.surf_offset[SURF_INDEX_WM_UBO(0)]);
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_wm_ubo_surfaces = {
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = (_NEW_PROGRAM |
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       _NEW_BUFFER_OBJECT),
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = BRW_NEW_BATCH,
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = 0,
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_upload_wm_ubo_surfaces,
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Constructs the binding table for the WM surface state, which maps unit
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * numbers to surface state objects.
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_wm_binding_table(struct brw_context *brw)
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *bind;
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Might want to calculate nr_surfaces first, to avoid taking up so much
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * space for the binding table.
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bind = brw_state_batch(brw, AUB_TRACE_BINDING_TABLE,
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  sizeof(uint32_t) * BRW_MAX_WM_SURFACES,
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  32, &brw->wm.bind_bo_offset);
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* BRW_NEW_SURFACES */
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < BRW_MAX_WM_SURFACES; i++) {
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bind[i] = brw->wm.surf_offset[i];
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw->state.dirty.brw |= BRW_NEW_PS_BINDING_TABLE;
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_wm_binding_table = {
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa = 0,
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw = (BRW_NEW_BATCH |
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_NEW_SURFACES),
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = 0
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_upload_wm_binding_table,
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen4_init_vtable_surface_functions(struct brw_context *brw)
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel->vtbl.update_texture_surface = brw_update_texture_surface;
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel->vtbl.update_renderbuffer_surface = brw_update_renderbuffer_surface;
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel->vtbl.update_null_renderbuffer_surface =
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_update_null_renderbuffer_surface;
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel->vtbl.create_constant_surface = brw_create_constant_surface;
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1457