gen7_wm_surface_state.c revision f0d5c92a4c9d5057d727819e501d80c5dfcdf76e
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"
31b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
32b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_context.h"
33b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_state.h"
34b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_defines.h"
35b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_wm.h"
36b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
37b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
38b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_set_surface_tiling(struct gen7_surface_state *surf, uint32_t tiling)
39b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
40b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   switch (tiling) {
41b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_NONE:
42b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 0;
43b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = 0;
44b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
45b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_X:
46b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 1;
47b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = BRW_TILEWALK_XMAJOR;
48b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
49b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_Y:
50b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 1;
51b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = BRW_TILEWALK_YMAJOR;
52b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
53b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
54b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
55b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
56b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
57b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_texture_surface(struct gl_context *ctx, GLuint unit)
58b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
59b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct brw_context *brw = brw_context(ctx);
60b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
61b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_texture_object *intelObj = intel_texture_object(tObj);
626781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   struct intel_mipmap_tree *mt = intelObj->mt;
63b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
64b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
65b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
66b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
67fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   int width, height, depth;
68fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt
69fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth);
70b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
71d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
72e7c29c5de82f6de3d30ed1143d9672dd2e25f0e7Kenneth Graunke			  sizeof(*surf), 32, &brw->bind.surf_offset[surf_index]);
73b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
74b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
756781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   if (mt->align_h == 4)
766781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke      surf->ss0.vertical_alignment = 1;
77f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt   if (mt->align_w == 8)
78f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt      surf->ss0.horizontal_alignment = 1;
796781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke
80b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = translate_tex_target(tObj->Target);
81e71fc6a8200cd78037a9788230ec0cc9f451a4b1Eric Anholt   surf->ss0.surface_format = translate_tex_format(mt->format,
82b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   firstImage->InternalFormat,
83b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   sampler->DepthMode,
84b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   sampler->sRGBDecode);
85b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   if (tObj->Target == GL_TEXTURE_CUBE_MAP) {
86b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_x = 1;
87b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_y = 1;
88b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_z = 1;
89b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_x = 1;
90b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_y = 1;
91b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_z = 1;
92b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
93b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
944273943a07bb577f91972b64232d394c1197c564Kenneth Graunke   surf->ss0.is_array = depth > 1 && tObj->Target != GL_TEXTURE_3D;
954273943a07bb577f91972b64232d394c1197c564Kenneth Graunke
96b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, intelObj->mt->region->tiling);
97b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
98b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss0 remaining fields:
99b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - vert_line_stride (exists on gen6 but we ignore it)
100b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - vert_line_stride_ofs (exists on gen6 but we ignore it)
101b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - surface_array_spacing
102b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - render_cache_read_write (exists on gen6 but ignored here)
103b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
104b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
1058004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt   surf->ss1.base_addr = intelObj->mt->region->bo->offset; /* reloc */
106b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
107fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss2.width = width - 1;
108fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss2.height = height - 1;
109b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
110b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.pitch = (intelObj->mt->region->pitch * intelObj->mt->cpp) - 1;
111fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss3.depth = depth - 1;
112b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
113b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss4: ignored? */
114b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
115b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss5.mip_count = intelObj->_MaxLevel - tObj->BaseLevel;
116b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss5.min_lod = 0;
117b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
118b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss5 remaining fields:
119b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - x_offset (N/A for textures?)
120b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - y_offset (ditto)
121b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - cache_control
122b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
123b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
124b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* Emit relocation to surface contents */
125b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
126e7c29c5de82f6de3d30ed1143d9672dd2e25f0e7Kenneth Graunke			   brw->bind.surf_offset[surf_index] +
127b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   offsetof(struct gen7_surface_state, ss1),
1288004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   intelObj->mt->region->bo, 0,
129b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_SAMPLER, 0);
130b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
131b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
132b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/**
133b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Create the constant buffer surface.  Vertex/fragment shader constants will
134b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * be read from this buffer with Data Port Read instructions/messages.
135b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */
1364ef8464068bc96ea9af71bbd18d121358db303b2Kenneth Graunkevoid
137b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_create_constant_surface(struct brw_context *brw,
138b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     drm_intel_bo *bo,
139b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     int width,
140b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     uint32_t *out_offset)
141b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
142b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   const GLint w = width - 1;
143b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
144b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
145d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
146d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt			  sizeof(*surf), 32, out_offset);
147b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
148b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
149b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_BUFFER;
150b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_format = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT;
151b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
152b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.render_cache_read_write = 1;
153b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
154b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   assert(bo);
155b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss1.base_addr = bo->offset; /* reloc */
156b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
157b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.width = w & 0x7f;            /* bits 6:0 of size or width */
158b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.height = (w >> 7) & 0x1fff;  /* bits 19:7 of size or width */
159b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.depth = (w >> 20) & 0x7f;    /* bits 26:20 of size or width */
160fcd5af4a916b4ba7860ba27eb47404934bde0d08Paul Berry   surf->ss3.pitch = (16 - 1); /* ignored */
161b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, I915_TILING_NONE); /* tiling now allowed */
162b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
163b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
164b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * bspec ("Data Cache") says that the data cache does not exist as
165b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * a separate cache and is just the sampler cache.
166b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
167b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
168b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   (*out_offset +
169b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			    offsetof(struct gen7_surface_state, ss1)),
170b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   bo, 0,
171b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_SAMPLER, 0);
172b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
173b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
174b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
175b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_null_renderbuffer_surface(struct brw_context *brw, unsigned unit)
176b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
177b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
178b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
179d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
180e7c29c5de82f6de3d30ed1143d9672dd2e25f0e7Kenneth Graunke			  sizeof(*surf), 32, &brw->bind.surf_offset[unit]);
181b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
182b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
183b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_NULL;
184b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
185b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
186b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
187b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/**
188b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Sets up a surface state structure to point at the given region.
189b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * While it is only used for the front/back buffer currently, it should be
190b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * usable for further buffers when doing ARB_draw_buffer support.
191b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */
192b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
193b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_renderbuffer_surface(struct brw_context *brw,
194b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke				 struct gl_renderbuffer *rb,
195b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke				 unsigned int unit)
196b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
197b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_context *intel = &brw->intel;
198b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_context *ctx = &intel->ctx;
199b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_renderbuffer *irb = intel_renderbuffer(rb);
200da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace   struct intel_region *region = irb->mt->region;
201b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
2025e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   uint32_t tile_x, tile_y;
203b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
204d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
205e7c29c5de82f6de3d30ed1143d9672dd2e25f0e7Kenneth Graunke			  sizeof(*surf), 32, &brw->bind.surf_offset[unit]);
206b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
207b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
2086781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   if (irb->mt->align_h == 4)
2096781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke      surf->ss0.vertical_alignment = 1;
210f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt   if (irb->mt->align_w == 8)
211f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt      surf->ss0.horizontal_alignment = 1;
2126781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke
213b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   switch (irb->Base.Format) {
214b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case MESA_FORMAT_SARGB8:
215b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      /* without GL_EXT_framebuffer_sRGB we shouldn't bind sRGB
216b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke	 surfaces to the blend/update as sRGB */
217b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      if (ctx->Color.sRGBEnabled)
218b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke	 surf->ss0.surface_format = brw_format_for_mesa_format(irb->Base.Format);
219b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      else
220b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke	 surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
221b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
222b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   default:
2236661b7596f3b26a773ccde79f018179713b6b6e0Eric Anholt      assert(brw_render_target_supported(intel, irb->Base.Format));
224ca10b2d4494798405a5fd654201291944645af5dEric Anholt      surf->ss0.surface_format = brw->render_target_format[irb->Base.Format];
225ca10b2d4494798405a5fd654201291944645af5dEric Anholt      if (unlikely(!brw->format_supported_as_render_target[irb->Base.Format])) {
226ca10b2d4494798405a5fd654201291944645af5dEric Anholt	 _mesa_problem(ctx, "%s: renderbuffer format %s unsupported\n",
227ca10b2d4494798405a5fd654201291944645af5dEric Anholt		       __FUNCTION__, _mesa_get_format_name(irb->Base.Format));
228ca10b2d4494798405a5fd654201291944645af5dEric Anholt      }
229ca10b2d4494798405a5fd654201291944645af5dEric Anholt       break;
230b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
231b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
232b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_2D;
2335e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   /* reloc */
234b17aab5753a6d14c9e757bedb186963b2dae8823Eric Anholt   surf->ss1.base_addr = intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y);
2358004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt   surf->ss1.base_addr += region->bo->offset; /* reloc */
236b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
2375e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(brw->has_surface_tile_offset);
2385e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   /* Note that the low bits of these fields are missing, so
2395e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke    * there's the possibility of getting in trouble.
2405e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke    */
2415e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(tile_x % 4 == 0);
2425e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(tile_y % 2 == 0);
2435e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   surf->ss5.x_offset = tile_x / 4;
2445e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   surf->ss5.y_offset = tile_y / 2;
2455e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke
246b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.width = rb->Width - 1;
247b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.height = rb->Height - 1;
248b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, region->tiling);
249b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.pitch = (region->pitch * region->cpp) - 1;
250b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
251b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
252e7c29c5de82f6de3d30ed1143d9672dd2e25f0e7Kenneth Graunke			   brw->bind.surf_offset[unit] +
253b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   offsetof(struct gen7_surface_state, ss1),
2548004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   region->bo,
2558004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   surf->ss1.base_addr - region->bo->offset,
256b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_RENDER,
257b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_RENDER);
258b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
259b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
2605d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkevoid
2615d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkegen7_init_vtable_surface_functions(struct brw_context *brw)
2625d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke{
2635d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   struct intel_context *intel = &brw->intel;
2645d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke
2655d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_texture_surface = gen7_update_texture_surface;
2665d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_renderbuffer_surface = gen7_update_renderbuffer_surface;
2675d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_null_renderbuffer_surface =
2685d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke      gen7_update_null_renderbuffer_surface;
2695d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.create_constant_surface = gen7_create_constant_surface;
2705d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke}
271