1b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/*
2b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Copyright © 2011 Intel Corporation
3b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke *
4b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Permission is hereby granted, free of charge, to any person obtaining a
5b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * copy of this software and associated documentation files (the "Software"),
6b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * to deal in the Software without restriction, including without limitation
7b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * and/or sell copies of the Software, and to permit persons to whom the
9b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Software is furnished to do so, subject to the following conditions:
10b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke *
11b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * The above copyright notice and this permission notice (including the next
12b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * paragraph) shall be included in all copies or substantial portions of the
13b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Software.
14b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke *
15b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * IN THE SOFTWARE.
22b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */
23b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "main/mtypes.h"
24b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "main/samplerobj.h"
25b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "program/prog_parameter.h"
26b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
27b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_mipmap_tree.h"
28b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_batchbuffer.h"
29b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_tex.h"
30b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_fbo.h"
31a07cf3397e332388d3599c83e50ac45511972890Eric Anholt#include "intel_buffer_objects.h"
32b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
33b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_context.h"
34b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_state.h"
35b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_defines.h"
36b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_wm.h"
37b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
3842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke/**
3942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke * Convert an swizzle enumeration (i.e. SWIZZLE_X) to one of the Gen7.5+
4042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke * "Shader Channel Select" enumerations (i.e. HSW_SCS_RED)
4142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke */
4242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunkestatic unsigned
4342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunkeswizzle_to_scs(GLenum swizzle)
4442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke{
4542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   switch (swizzle) {
4642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   case SWIZZLE_X:
4742df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      return HSW_SCS_RED;
4842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   case SWIZZLE_Y:
4942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      return HSW_SCS_GREEN;
5042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   case SWIZZLE_Z:
5142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      return HSW_SCS_BLUE;
5242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   case SWIZZLE_W:
5342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      return HSW_SCS_ALPHA;
5442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   case SWIZZLE_ZERO:
5542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      return HSW_SCS_ZERO;
5642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   case SWIZZLE_ONE:
5742df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      return HSW_SCS_ONE;
5842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   }
5942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke
6042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   assert(!"Should not get here: invalid swizzle mode");
6142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke   return HSW_SCS_ZERO;
6242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke}
6342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke
6436e34134184e72532f2e6a2b9438f72284ac3057Paul Berryvoid
65b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_set_surface_tiling(struct gen7_surface_state *surf, uint32_t tiling)
66b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
67b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   switch (tiling) {
68b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_NONE:
69b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 0;
70b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = 0;
71b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
72b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_X:
73b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 1;
74b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = BRW_TILEWALK_XMAJOR;
75b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
76b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_Y:
77b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 1;
78b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = BRW_TILEWALK_YMAJOR;
79b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
80b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
81b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
82b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
8319e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry
8419e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berryvoid
85989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berrygen7_set_surface_msaa(struct gen7_surface_state *surf, unsigned num_samples,
86989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry                      enum intel_msaa_layout layout)
8719e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry{
8819e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry   if (num_samples > 4)
8919e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      surf->ss4.num_multisamples = GEN7_SURFACE_MULTISAMPLECOUNT_8;
9097fc89c6cbaa3b5ef7f678d2dc2c7d5bbba05315Paul Berry   else if (num_samples > 1)
9119e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      surf->ss4.num_multisamples = GEN7_SURFACE_MULTISAMPLECOUNT_4;
9219e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry   else
9319e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry      surf->ss4.num_multisamples = GEN7_SURFACE_MULTISAMPLECOUNT_1;
94989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry
95989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry   surf->ss4.multisampled_surface_storage_format =
96989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry      layout == INTEL_MSAA_LAYOUT_IMS ?
97989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry      GEN7_SURFACE_MSFMT_DEPTH_STENCIL :
98989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry      GEN7_SURFACE_MSFMT_MSS;
9919e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry}
10019e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry
10119e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry
10231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berryvoid
1037b3263af696e504ec68b91b0ce128d46a0691dcePaul Berrygen7_set_surface_mcs_info(struct brw_context *brw,
1047b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                          struct gen7_surface_state *surf,
1057b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                          uint32_t surf_offset,
1067b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                          const struct intel_mipmap_tree *mcs_mt,
1077b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                          bool is_render_target)
1087b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry{
1097b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   /* From the Ivy Bridge PRM, Vol4 Part1 p76, "MCS Base Address":
1107b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    *
1117b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    *     "The MCS surface must be stored as Tile Y."
1127b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    */
1137b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   assert(mcs_mt->region->tiling == I915_TILING_Y);
1147b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry
1157b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   /* Compute the pitch in units of tiles.  To do this we need to divide the
1167b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    * pitch in bytes by 128, since a single Y-tile is 128 bytes wide.
1177b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    */
1187b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   unsigned pitch_bytes = mcs_mt->region->pitch * mcs_mt->cpp;
1197b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   unsigned pitch_tiles = pitch_bytes / 128;
1207b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry
1217b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   /* The upper 20 bits of surface state DWORD 6 are the upper 20 bits of the
1227b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    * GPU address of the MCS buffer; the lower 12 bits contain other control
1237b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    * information.  Since buffer addresses are always on 4k boundaries (and
1247b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    * thus have their lower 12 bits zero), we can use an ordinary reloc to do
1257b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    * the necessary address translation.
1267b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry    */
1277b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   assert ((mcs_mt->region->bo->offset & 0xfff) == 0);
1287b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   surf->ss6.mcs_enabled.mcs_enable = 1;
1297b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   surf->ss6.mcs_enabled.mcs_surface_pitch = pitch_tiles - 1;
1307b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   surf->ss6.mcs_enabled.mcs_base_address = mcs_mt->region->bo->offset >> 12;
1317b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
1327b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                           surf_offset +
1337b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                           offsetof(struct gen7_surface_state, ss6),
1347b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                           mcs_mt->region->bo,
1357b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                           surf->ss6.raw_data & 0xfff,
1367b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                           is_render_target ? I915_GEM_DOMAIN_RENDER
1377b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                           : I915_GEM_DOMAIN_SAMPLER,
1387b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                           is_render_target ? I915_GEM_DOMAIN_RENDER : 0);
1397b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry}
1407b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry
1417b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry
1427b3263af696e504ec68b91b0ce128d46a0691dcePaul Berryvoid
14331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berrygen7_check_surface_setup(struct gen7_surface_state *surf,
14431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry                         bool is_render_target)
14531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry{
14631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   bool is_multisampled =
14731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      surf->ss4.num_multisamples != GEN7_SURFACE_MULTISAMPLECOUNT_1;
14831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State >
14931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Surface Array
15031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * Spacing:
15131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
15231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   If Multisampled Surface Storage Format is MSFMT_MSS and Number of
15331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   Multisamples is not MULTISAMPLECOUNT_1, this field must be set to
15431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   ARYSPC_LOD0.
15531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    */
15631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   if (surf->ss4.multisampled_surface_storage_format == GEN7_SURFACE_MSFMT_MSS
15731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry       && is_multisampled)
15831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      assert(surf->ss0.surface_array_spacing == GEN7_SURFACE_ARYSPC_LOD0);
15931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
16031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State >
16131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Multisampled
16231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * Surface Storage Format:
16331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
16431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   All multisampled render target surfaces must have this field set to
16531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   MSFMT_MSS.
16631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
16731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * But also:
16831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
16931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   This field is ignored if Number of Multisamples is MULTISAMPLECOUNT_1.
17031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    */
17131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   if (is_render_target && is_multisampled) {
17231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      assert(surf->ss4.multisampled_surface_storage_format ==
17331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry             GEN7_SURFACE_MSFMT_MSS);
17431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   }
17531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
17631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State >
17731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Multisampled
17831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * Surface Storage Format:
17931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
18031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   If the surface’s Number of Multisamples is MULTISAMPLECOUNT_8, Width
18131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   is >= 8192 (meaning the actual surface width is >= 8193 pixels), this
18231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   field must be set to MSFMT_MSS.
18331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    */
18431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   if (surf->ss4.num_multisamples == GEN7_SURFACE_MULTISAMPLECOUNT_8 &&
18531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry       surf->ss2.width >= 8192) {
18631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      assert(surf->ss4.multisampled_surface_storage_format ==
18731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry             GEN7_SURFACE_MSFMT_MSS);
18831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   }
18931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
19031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State >
19131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Multisampled
19231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * Surface Storage Format:
19331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
19431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   If the surface’s Number of Multisamples is MULTISAMPLECOUNT_8,
19531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   ((Depth+1) * (Height+1)) is > 4,194,304, OR if the surface’s Number of
19631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   Multisamples is MULTISAMPLECOUNT_4, ((Depth+1) * (Height+1)) is >
19731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   8,388,608, this field must be set to MSFMT_DEPTH_STENCIL.This field
19831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   must be set to MSFMT_DEPTH_STENCIL if Surface Format is one of the
19931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   following: I24X8_UNORM, L24X8_UNORM, A24X8_UNORM, or
20031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   R24_UNORM_X8_TYPELESS.
20131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
20231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    * But also:
20331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *
20431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    *   This field is ignored if Number of Multisamples is MULTISAMPLECOUNT_1.
20531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry    */
20631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   uint32_t depth = surf->ss3.depth + 1;
20731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   uint32_t height = surf->ss2.height + 1;
20831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   if (surf->ss4.num_multisamples == GEN7_SURFACE_MULTISAMPLECOUNT_8 &&
20931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry       depth * height > 4194304) {
21031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      assert(surf->ss4.multisampled_surface_storage_format ==
21131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry             GEN7_SURFACE_MSFMT_DEPTH_STENCIL);
21231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   }
21331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   if (surf->ss4.num_multisamples == GEN7_SURFACE_MULTISAMPLECOUNT_4 &&
21431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry       depth * height > 8388608) {
21531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      assert(surf->ss4.multisampled_surface_storage_format ==
21631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry             GEN7_SURFACE_MSFMT_DEPTH_STENCIL);
21731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   }
21831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   if (is_multisampled) {
21931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      switch (surf->ss0.surface_format) {
22031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      case BRW_SURFACEFORMAT_I24X8_UNORM:
22131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      case BRW_SURFACEFORMAT_L24X8_UNORM:
22231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      case BRW_SURFACEFORMAT_A24X8_UNORM:
22331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      case BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS:
22431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry         assert(surf->ss4.multisampled_surface_storage_format ==
22531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry                GEN7_SURFACE_MSFMT_DEPTH_STENCIL);
22631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry      }
22731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   }
22831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry}
22931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
23031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
231b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
23228fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunkegen7_update_buffer_texture_surface(struct gl_context *ctx,
23328fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke                                   unsigned unit,
23428fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke                                   uint32_t *binding_table,
23528fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke                                   unsigned surf_index)
236a07cf3397e332388d3599c83e50ac45511972890Eric Anholt{
237a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct brw_context *brw = brw_context(ctx);
238a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
239a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct gen7_surface_state *surf;
240a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct intel_buffer_object *intel_obj =
241a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      intel_buffer_object(tObj->BufferObject);
242a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   drm_intel_bo *bo = intel_obj ? intel_obj->buffer : NULL;
243a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   gl_format format = tObj->_BufferObjectFormat;
244a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   int texel_size = _mesa_get_format_bytes(format);
245a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
246a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
24728fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke			  sizeof(*surf), 32, &binding_table[surf_index]);
248a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   memset(surf, 0, sizeof(*surf));
249a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
250a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf->ss0.surface_type = BRW_SURFACE_BUFFER;
251a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf->ss0.surface_format = brw_format_for_mesa_format(format);
252a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
253a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf->ss0.render_cache_read_write = 1;
254a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
255a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   if (surf->ss0.surface_format == 0 && format != MESA_FORMAT_RGBA_FLOAT32) {
256a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      _mesa_problem(NULL, "bad format %s for texture buffer\n",
257a07cf3397e332388d3599c83e50ac45511972890Eric Anholt		    _mesa_get_format_name(format));
258a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   }
259a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
260a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   if (bo) {
261a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss1.base_addr = bo->offset; /* reloc */
262a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
263a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
264a07cf3397e332388d3599c83e50ac45511972890Eric Anholt       * bspec ("Data Cache") says that the data cache does not exist as
265a07cf3397e332388d3599c83e50ac45511972890Eric Anholt       * a separate cache and is just the sampler cache.
266a07cf3397e332388d3599c83e50ac45511972890Eric Anholt       */
267a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      drm_intel_bo_emit_reloc(brw->intel.batch.bo,
26828fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke			      (binding_table[surf_index] +
269a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			       offsetof(struct gen7_surface_state, ss1)),
270a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			      bo, 0,
271a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			      I915_GEM_DOMAIN_SAMPLER, 0);
272a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
273a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      int w = intel_obj->Base.Size / texel_size;
274a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.width = w & 0x7f;            /* bits 6:0 of size or width */
275a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.height = (w >> 7) & 0x1fff;  /* bits 19:7 of size or width */
276a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.depth = (w >> 20) & 0x7f;    /* bits 26:20 of size or width */
277a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.pitch = texel_size - 1;
278a07cf3397e332388d3599c83e50ac45511972890Eric Anholt} else {
279a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss1.base_addr = 0;
280a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.width = 0;
281a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.height = 0;
282a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.depth = 0;
283a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.pitch = 0;
284a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   }
285a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
286a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   gen7_set_surface_tiling(surf, I915_TILING_NONE);
28731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
28831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   gen7_check_surface_setup(surf, false /* is_render_target */);
289a07cf3397e332388d3599c83e50ac45511972890Eric Anholt}
290a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
291a07cf3397e332388d3599c83e50ac45511972890Eric Anholtstatic void
29228fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunkegen7_update_texture_surface(struct gl_context *ctx,
29328fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke                            unsigned unit,
29428fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke                            uint32_t *binding_table,
29528fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke                            unsigned surf_index)
296b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
297b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct brw_context *brw = brw_context(ctx);
298b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
299b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_texture_object *intelObj = intel_texture_object(tObj);
3006781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   struct intel_mipmap_tree *mt = intelObj->mt;
301b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
302b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
303b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
304fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   int width, height, depth;
305fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt
306a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   if (tObj->Target == GL_TEXTURE_BUFFER) {
30728fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke      gen7_update_buffer_texture_surface(ctx, unit, binding_table, surf_index);
308a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      return;
309a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   }
310a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
311455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry   /* We don't support MSAA for textures. */
312455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry   assert(!mt->array_spacing_lod0);
31397fc89c6cbaa3b5ef7f678d2dc2c7d5bbba05315Paul Berry   assert(mt->num_samples <= 1);
314455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry
315fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth);
316b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
317d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
31828fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke			  sizeof(*surf), 32, &binding_table[surf_index]);
319b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
320b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
3216781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   if (mt->align_h == 4)
3226781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke      surf->ss0.vertical_alignment = 1;
323f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt   if (mt->align_w == 8)
324f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt      surf->ss0.horizontal_alignment = 1;
3256781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke
326b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = translate_tex_target(tObj->Target);
327e71fc6a8200cd78037a9788230ec0cc9f451a4b1Eric Anholt   surf->ss0.surface_format = translate_tex_format(mt->format,
328b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   firstImage->InternalFormat,
329c37efbfe4c415b6fd2d4f968220d7c9b62f11ecfPauli Nieminen                                                   tObj->DepthMode,
330b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   sampler->sRGBDecode);
331b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   if (tObj->Target == GL_TEXTURE_CUBE_MAP) {
332b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_x = 1;
333b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_y = 1;
334b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_z = 1;
335b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_x = 1;
336b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_y = 1;
337b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_z = 1;
338b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
339b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
3404273943a07bb577f91972b64232d394c1197c564Kenneth Graunke   surf->ss0.is_array = depth > 1 && tObj->Target != GL_TEXTURE_3D;
3414273943a07bb577f91972b64232d394c1197c564Kenneth Graunke
342b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, intelObj->mt->region->tiling);
343b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
344b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss0 remaining fields:
345b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - vert_line_stride (exists on gen6 but we ignore it)
346b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - vert_line_stride_ofs (exists on gen6 but we ignore it)
347b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - surface_array_spacing
348b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - render_cache_read_write (exists on gen6 but ignored here)
349b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
350b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
35102ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg   surf->ss1.base_addr =
35202ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg      intelObj->mt->region->bo->offset + intelObj->mt->offset; /* reloc */
353b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
354fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss2.width = width - 1;
355fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss2.height = height - 1;
356b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
357b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.pitch = (intelObj->mt->region->pitch * intelObj->mt->cpp) - 1;
358fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss3.depth = depth - 1;
359b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
360b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss4: ignored? */
361b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
362b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss5.mip_count = intelObj->_MaxLevel - tObj->BaseLevel;
363b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss5.min_lod = 0;
364b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
365b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss5 remaining fields:
366b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - x_offset (N/A for textures?)
367b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - y_offset (ditto)
368b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - cache_control
369b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
370b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
3714848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   if (brw->intel.is_haswell) {
37242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      /* Handling GL_ALPHA as a surface format override breaks 1.30+ style
37342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke       * texturing functions that return a float, as our code generation always
37442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke       * selects the .x channel (which would always be 0).
37542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke       */
37642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      const bool alpha_depth = tObj->DepthMode == GL_ALPHA &&
37742df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke         (firstImage->_BaseFormat == GL_DEPTH_COMPONENT ||
37842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke          firstImage->_BaseFormat == GL_DEPTH_STENCIL);
37942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke
38042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      const int swizzle =
38142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke         unlikely(alpha_depth) ? SWIZZLE_XYZW : brw_get_texture_swizzle(tObj);
38242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke
38342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      surf->ss7.shader_channel_select_r = swizzle_to_scs(GET_SWZ(swizzle, 0));
38442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      surf->ss7.shader_channel_select_g = swizzle_to_scs(GET_SWZ(swizzle, 1));
38542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      surf->ss7.shader_channel_select_b = swizzle_to_scs(GET_SWZ(swizzle, 2));
38642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke      surf->ss7.shader_channel_select_a = swizzle_to_scs(GET_SWZ(swizzle, 3));
3874848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   }
3884848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke
389b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* Emit relocation to surface contents */
390b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
39128fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke			   binding_table[surf_index] +
392b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   offsetof(struct gen7_surface_state, ss1),
39302ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg			   intelObj->mt->region->bo, intelObj->mt->offset,
394b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_SAMPLER, 0);
39531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
39631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   gen7_check_surface_setup(surf, false /* is_render_target */);
397b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
398b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
399b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/**
400b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Create the constant buffer surface.  Vertex/fragment shader constants will
401b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * be read from this buffer with Data Port Read instructions/messages.
402b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */
4034ef8464068bc96ea9af71bbd18d121358db303b2Kenneth Graunkevoid
404b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_create_constant_surface(struct brw_context *brw,
405b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     drm_intel_bo *bo,
4065bffbd7ba2ba2ff21469b2a69a0ed67f0802fec7Eric Anholt			     uint32_t offset,
407b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     int width,
408b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     uint32_t *out_offset)
409b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
410b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   const GLint w = width - 1;
411b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
412b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
413d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
414d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt			  sizeof(*surf), 32, out_offset);
415b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
416b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
417b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_BUFFER;
418b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_format = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT;
419b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
420b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.render_cache_read_write = 1;
421b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
422b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   assert(bo);
4235bffbd7ba2ba2ff21469b2a69a0ed67f0802fec7Eric Anholt   surf->ss1.base_addr = bo->offset + offset; /* reloc */
424b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
425b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.width = w & 0x7f;            /* bits 6:0 of size or width */
426b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.height = (w >> 7) & 0x1fff;  /* bits 19:7 of size or width */
427b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.depth = (w >> 20) & 0x7f;    /* bits 26:20 of size or width */
428aa8ce1be4a30e7c8224af52f83f1e50d251b01d4Eric Anholt   surf->ss3.pitch = (16 - 1); /* stride between samples */
429b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, I915_TILING_NONE); /* tiling now allowed */
430b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
4314848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   if (brw->intel.is_haswell) {
432cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_r = HSW_SCS_RED;
433cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_g = HSW_SCS_GREEN;
434cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_b = HSW_SCS_BLUE;
435cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_a = HSW_SCS_ALPHA;
4364848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   }
4374848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke
438b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
439b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * bspec ("Data Cache") says that the data cache does not exist as
440b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * a separate cache and is just the sampler cache.
441b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
442b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
443b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   (*out_offset +
444b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			    offsetof(struct gen7_surface_state, ss1)),
4455bffbd7ba2ba2ff21469b2a69a0ed67f0802fec7Eric Anholt			   bo, offset,
446b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_SAMPLER, 0);
44731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
44831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   gen7_check_surface_setup(surf, false /* is_render_target */);
449b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
450b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
451b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
452b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_null_renderbuffer_surface(struct brw_context *brw, unsigned unit)
453b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
4540aeb87023e64807734aee323e76f81796d525a36Paul Berry   /* From the Ivy bridge PRM, Vol4 Part1 p62 (Surface Type: Programming
4550aeb87023e64807734aee323e76f81796d525a36Paul Berry    * Notes):
4560aeb87023e64807734aee323e76f81796d525a36Paul Berry    *
4570aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     A null surface is used in instances where an actual surface is not
4580aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     bound. When a write message is generated to a null surface, no
4590aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     actual surface is written to. When a read message (including any
4600aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     sampling engine message) is generated to a null surface, the result
4610aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     is all zeros. Note that a null surface type is allowed to be used
4620aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     with all messages, even if it is not specificially indicated as
4630aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     supported. All of the remaining fields in surface state are ignored
4640aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     for null surfaces, with the following exceptions: Width, Height,
4650aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     Depth, LOD, and Render Target View Extent fields must match the
4660aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     depth buffer’s corresponding state for all render target surfaces,
4670aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     including null.
4680aeb87023e64807734aee323e76f81796d525a36Paul Berry    */
4690aeb87023e64807734aee323e76f81796d525a36Paul Berry   struct intel_context *intel = &brw->intel;
4700aeb87023e64807734aee323e76f81796d525a36Paul Berry   struct gl_context *ctx = &intel->ctx;
471b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
472b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
4730aeb87023e64807734aee323e76f81796d525a36Paul Berry   /* _NEW_BUFFERS */
4740aeb87023e64807734aee323e76f81796d525a36Paul Berry   const struct gl_framebuffer *fb = ctx->DrawBuffer;
4750aeb87023e64807734aee323e76f81796d525a36Paul Berry
476d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
4775a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			  sizeof(*surf), 32, &brw->wm.surf_offset[unit]);
478b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
479b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
480b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_NULL;
481b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
48231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
4830aeb87023e64807734aee323e76f81796d525a36Paul Berry   surf->ss2.width = fb->Width - 1;
4840aeb87023e64807734aee323e76f81796d525a36Paul Berry   surf->ss2.height = fb->Height - 1;
4850aeb87023e64807734aee323e76f81796d525a36Paul Berry
4860aeb87023e64807734aee323e76f81796d525a36Paul Berry   /* From the Ivy bridge PRM, Vol4 Part1 p65 (Tiled Surface: Programming Notes):
4870aeb87023e64807734aee323e76f81796d525a36Paul Berry    *
4880aeb87023e64807734aee323e76f81796d525a36Paul Berry    *     If Surface Type is SURFTYPE_NULL, this field must be TRUE.
4890aeb87023e64807734aee323e76f81796d525a36Paul Berry    */
4900aeb87023e64807734aee323e76f81796d525a36Paul Berry   gen7_set_surface_tiling(surf, I915_TILING_Y);
4910aeb87023e64807734aee323e76f81796d525a36Paul Berry
49231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   gen7_check_surface_setup(surf, true /* is_render_target */);
493b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
494b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
495b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/**
496b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Sets up a surface state structure to point at the given region.
497b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * While it is only used for the front/back buffer currently, it should be
498b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * usable for further buffers when doing ARB_draw_buffer support.
499b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */
500b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
501b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_renderbuffer_surface(struct brw_context *brw,
502b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke				 struct gl_renderbuffer *rb,
503b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke				 unsigned int unit)
504b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
505b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_context *intel = &brw->intel;
506b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_context *ctx = &intel->ctx;
507b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_renderbuffer *irb = intel_renderbuffer(rb);
508da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace   struct intel_region *region = irb->mt->region;
509b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
5105e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   uint32_t tile_x, tile_y;
511924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul   gl_format rb_format = intel_rb_format(irb);
512b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
513d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
5145a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			  sizeof(*surf), 32, &brw->wm.surf_offset[unit]);
515b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
516b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
5171bd4d456cdecf7bea55f4e3dac574af54efad994Paul Berry   /* Render targets can't use IMS layout */
5181bd4d456cdecf7bea55f4e3dac574af54efad994Paul Berry   assert(irb->mt->msaa_layout != INTEL_MSAA_LAYOUT_IMS);
519455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry
5206781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   if (irb->mt->align_h == 4)
5216781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke      surf->ss0.vertical_alignment = 1;
522f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt   if (irb->mt->align_w == 8)
523f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt      surf->ss0.horizontal_alignment = 1;
5246781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke
525924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul   switch (rb_format) {
526b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case MESA_FORMAT_SARGB8:
527fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt      /* _NEW_BUFFERS
528fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt       *
529fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt       * Without GL_EXT_framebuffer_sRGB we shouldn't bind sRGB surfaces to the
530fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt       * blend/update as sRGB.
531fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt       */
532b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      if (ctx->Color.sRGBEnabled)
533924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul	 surf->ss0.surface_format = brw_format_for_mesa_format(rb_format);
534b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      else
535b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke	 surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
536b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
537b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   default:
538796f44d77906342e5912e7da6bdba1ba86bab9f0Eric Anholt      assert(brw_render_target_supported(intel, rb));
539924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul      surf->ss0.surface_format = brw->render_target_format[rb_format];
540924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul      if (unlikely(!brw->format_supported_as_render_target[rb_format])) {
541ca10b2d4494798405a5fd654201291944645af5dEric Anholt	 _mesa_problem(ctx, "%s: renderbuffer format %s unsupported\n",
542924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul		       __FUNCTION__, _mesa_get_format_name(rb_format));
543ca10b2d4494798405a5fd654201291944645af5dEric Anholt      }
544ca10b2d4494798405a5fd654201291944645af5dEric Anholt       break;
545b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
546b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
547b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_2D;
548455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry   surf->ss0.surface_array_spacing = irb->mt->array_spacing_lod0 ?
549455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry      GEN7_SURFACE_ARYSPC_LOD0 : GEN7_SURFACE_ARYSPC_FULL;
550455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry
5515e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   /* reloc */
552b17aab5753a6d14c9e757bedb186963b2dae8823Eric Anholt   surf->ss1.base_addr = intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y);
5538004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt   surf->ss1.base_addr += region->bo->offset; /* reloc */
554b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
5555e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(brw->has_surface_tile_offset);
5565e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   /* Note that the low bits of these fields are missing, so
5575e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke    * there's the possibility of getting in trouble.
5585e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke    */
5595e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(tile_x % 4 == 0);
5605e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(tile_y % 2 == 0);
5615e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   surf->ss5.x_offset = tile_x / 4;
5625e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   surf->ss5.y_offset = tile_y / 2;
5635e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke
564b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.width = rb->Width - 1;
565b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.height = rb->Height - 1;
566b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, region->tiling);
567b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.pitch = (region->pitch * region->cpp) - 1;
568b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
569989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry   gen7_set_surface_msaa(surf, irb->mt->num_samples, irb->mt->msaa_layout);
57019e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry
5717b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   if (irb->mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) {
5727b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry      gen7_set_surface_mcs_info(brw, surf, brw->wm.surf_offset[unit],
5737b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry                                irb->mt->mcs_mt, true /* is_render_target */);
5747b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry   }
5757b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry
5764848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   if (intel->is_haswell) {
577cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_r = HSW_SCS_RED;
578cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_g = HSW_SCS_GREEN;
579cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_b = HSW_SCS_BLUE;
580cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke      surf->ss7.shader_channel_select_a = HSW_SCS_ALPHA;
5814848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   }
5824848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke
583b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
5845a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			   brw->wm.surf_offset[unit] +
585b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   offsetof(struct gen7_surface_state, ss1),
5868004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   region->bo,
5878004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   surf->ss1.base_addr - region->bo->offset,
588b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_RENDER,
589b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_RENDER);
59031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry
59131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry   gen7_check_surface_setup(surf, true /* is_render_target */);
592b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
593b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
5945d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkevoid
5955d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkegen7_init_vtable_surface_functions(struct brw_context *brw)
5965d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke{
5975d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   struct intel_context *intel = &brw->intel;
5985d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke
5995d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_texture_surface = gen7_update_texture_surface;
6005d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_renderbuffer_surface = gen7_update_renderbuffer_surface;
6015d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_null_renderbuffer_surface =
6025d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke      gen7_update_null_renderbuffer_surface;
6035d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.create_constant_surface = gen7_create_constant_surface;
6045d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke}
605