gen7_wm_surface_state.c revision a07cf3397e332388d3599c83e50ac45511972890
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
38b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
39b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_set_surface_tiling(struct gen7_surface_state *surf, uint32_t tiling)
40b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
41b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   switch (tiling) {
42b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_NONE:
43b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 0;
44b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = 0;
45b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
46b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_X:
47b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 1;
48b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = BRW_TILEWALK_XMAJOR;
49b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
50b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case I915_TILING_Y:
51b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tiled_surface = 1;
52b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.tile_walk = BRW_TILEWALK_YMAJOR;
53b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
54b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
55b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
56b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
57b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
58a07cf3397e332388d3599c83e50ac45511972890Eric Anholtgen7_update_buffer_texture_surface(struct gl_context *ctx, GLuint unit)
59a07cf3397e332388d3599c83e50ac45511972890Eric Anholt{
60a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct brw_context *brw = brw_context(ctx);
61a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
62a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
63a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct gen7_surface_state *surf;
64a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   struct intel_buffer_object *intel_obj =
65a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      intel_buffer_object(tObj->BufferObject);
66a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   drm_intel_bo *bo = intel_obj ? intel_obj->buffer : NULL;
67a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   gl_format format = tObj->_BufferObjectFormat;
68a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   int texel_size = _mesa_get_format_bytes(format);
69a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
70a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
71a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			  sizeof(*surf), 32, &brw->wm.surf_offset[surf_index]);
72a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   memset(surf, 0, sizeof(*surf));
73a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
74a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf->ss0.surface_type = BRW_SURFACE_BUFFER;
75a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf->ss0.surface_format = brw_format_for_mesa_format(format);
76a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
77a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   surf->ss0.render_cache_read_write = 1;
78a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
79a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   if (surf->ss0.surface_format == 0 && format != MESA_FORMAT_RGBA_FLOAT32) {
80a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      _mesa_problem(NULL, "bad format %s for texture buffer\n",
81a07cf3397e332388d3599c83e50ac45511972890Eric Anholt		    _mesa_get_format_name(format));
82a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   }
83a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
84a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   if (bo) {
85a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss1.base_addr = bo->offset; /* reloc */
86a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
87a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
88a07cf3397e332388d3599c83e50ac45511972890Eric Anholt       * bspec ("Data Cache") says that the data cache does not exist as
89a07cf3397e332388d3599c83e50ac45511972890Eric Anholt       * a separate cache and is just the sampler cache.
90a07cf3397e332388d3599c83e50ac45511972890Eric Anholt       */
91a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      drm_intel_bo_emit_reloc(brw->intel.batch.bo,
92a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			      (brw->wm.surf_offset[surf_index] +
93a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			       offsetof(struct gen7_surface_state, ss1)),
94a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			      bo, 0,
95a07cf3397e332388d3599c83e50ac45511972890Eric Anholt			      I915_GEM_DOMAIN_SAMPLER, 0);
96a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
97a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      int w = intel_obj->Base.Size / texel_size;
98a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.width = w & 0x7f;            /* bits 6:0 of size or width */
99a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.height = (w >> 7) & 0x1fff;  /* bits 19:7 of size or width */
100a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.depth = (w >> 20) & 0x7f;    /* bits 26:20 of size or width */
101a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.pitch = texel_size - 1;
102a07cf3397e332388d3599c83e50ac45511972890Eric Anholt} else {
103a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss1.base_addr = 0;
104a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.width = 0;
105a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss2.height = 0;
106a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.depth = 0;
107a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      surf->ss3.pitch = 0;
108a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   }
109a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
110a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   gen7_set_surface_tiling(surf, I915_TILING_NONE);
111a07cf3397e332388d3599c83e50ac45511972890Eric Anholt}
112a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
113a07cf3397e332388d3599c83e50ac45511972890Eric Anholtstatic void
114b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_texture_surface(struct gl_context *ctx, GLuint unit)
115b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
116b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct brw_context *brw = brw_context(ctx);
117b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
118b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_texture_object *intelObj = intel_texture_object(tObj);
1196781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   struct intel_mipmap_tree *mt = intelObj->mt;
120b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
121b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
122b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
123b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
124fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   int width, height, depth;
125fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt
126a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   if (tObj->Target == GL_TEXTURE_BUFFER) {
127a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      gen7_update_buffer_texture_surface(ctx, unit);
128a07cf3397e332388d3599c83e50ac45511972890Eric Anholt      return;
129a07cf3397e332388d3599c83e50ac45511972890Eric Anholt   }
130a07cf3397e332388d3599c83e50ac45511972890Eric Anholt
131fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth);
132b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
133d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
1345a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			  sizeof(*surf), 32, &brw->wm.surf_offset[surf_index]);
135b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
136b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
1376781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   if (mt->align_h == 4)
1386781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke      surf->ss0.vertical_alignment = 1;
139f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt   if (mt->align_w == 8)
140f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt      surf->ss0.horizontal_alignment = 1;
1416781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke
142b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = translate_tex_target(tObj->Target);
143e71fc6a8200cd78037a9788230ec0cc9f451a4b1Eric Anholt   surf->ss0.surface_format = translate_tex_format(mt->format,
144b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   firstImage->InternalFormat,
145b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   sampler->DepthMode,
146b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke                                                   sampler->sRGBDecode);
147b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   if (tObj->Target == GL_TEXTURE_CUBE_MAP) {
148b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_x = 1;
149b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_y = 1;
150b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_pos_z = 1;
151b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_x = 1;
152b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_y = 1;
153b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      surf->ss0.cube_neg_z = 1;
154b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
155b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
1564273943a07bb577f91972b64232d394c1197c564Kenneth Graunke   surf->ss0.is_array = depth > 1 && tObj->Target != GL_TEXTURE_3D;
1574273943a07bb577f91972b64232d394c1197c564Kenneth Graunke
158b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, intelObj->mt->region->tiling);
159b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
160b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss0 remaining fields:
161b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - vert_line_stride (exists on gen6 but we ignore it)
162b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - vert_line_stride_ofs (exists on gen6 but we ignore it)
163b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - surface_array_spacing
164b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - render_cache_read_write (exists on gen6 but ignored here)
165b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
166b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
1678004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt   surf->ss1.base_addr = intelObj->mt->region->bo->offset; /* reloc */
168b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
169fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss2.width = width - 1;
170fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss2.height = height - 1;
171b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
172b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.pitch = (intelObj->mt->region->pitch * intelObj->mt->cpp) - 1;
173fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   surf->ss3.depth = depth - 1;
174b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
175b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss4: ignored? */
176b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
177b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss5.mip_count = intelObj->_MaxLevel - tObj->BaseLevel;
178b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss5.min_lod = 0;
179b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
180b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* ss5 remaining fields:
181b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - x_offset (N/A for textures?)
182b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - y_offset (ditto)
183b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * - cache_control
184b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
185b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
1864848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   if (brw->intel.is_haswell) {
1874848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_r = HSW_SCS_RED;
1884848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_g = HSW_SCS_GREEN;
1894848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_b = HSW_SCS_BLUE;
1904848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_a = HSW_SCS_ALPHA;
1914848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   }
1924848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke
193b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* Emit relocation to surface contents */
194b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
1955a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			   brw->wm.surf_offset[surf_index] +
196b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   offsetof(struct gen7_surface_state, ss1),
1978004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   intelObj->mt->region->bo, 0,
198b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_SAMPLER, 0);
199b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
200b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
201b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/**
202b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Create the constant buffer surface.  Vertex/fragment shader constants will
203b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * be read from this buffer with Data Port Read instructions/messages.
204b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */
2054ef8464068bc96ea9af71bbd18d121358db303b2Kenneth Graunkevoid
206b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_create_constant_surface(struct brw_context *brw,
207b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     drm_intel_bo *bo,
208b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     int width,
209b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			     uint32_t *out_offset)
210b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
211b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   const GLint w = width - 1;
212b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
213b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
214d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
215d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt			  sizeof(*surf), 32, out_offset);
216b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
217b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
218b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_BUFFER;
219b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_format = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT;
220b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
221b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.render_cache_read_write = 1;
222b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
223b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   assert(bo);
224b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss1.base_addr = bo->offset; /* reloc */
225b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
226b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.width = w & 0x7f;            /* bits 6:0 of size or width */
227b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.height = (w >> 7) & 0x1fff;  /* bits 19:7 of size or width */
228b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.depth = (w >> 20) & 0x7f;    /* bits 26:20 of size or width */
229aa8ce1be4a30e7c8224af52f83f1e50d251b01d4Eric Anholt   surf->ss3.pitch = (16 - 1); /* stride between samples */
230b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, I915_TILING_NONE); /* tiling now allowed */
231b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
2324848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   if (brw->intel.is_haswell) {
2334848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_r = HSW_SCS_RED;
2344848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_g = HSW_SCS_GREEN;
2354848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_b = HSW_SCS_BLUE;
2364848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_a = HSW_SCS_ALPHA;
2374848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   }
2384848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke
239b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
240b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * bspec ("Data Cache") says that the data cache does not exist as
241b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    * a separate cache and is just the sampler cache.
242b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke    */
243b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
244b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   (*out_offset +
245b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			    offsetof(struct gen7_surface_state, ss1)),
246b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   bo, 0,
247b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_SAMPLER, 0);
248b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
249b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
250b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
251b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_null_renderbuffer_surface(struct brw_context *brw, unsigned unit)
252b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
253b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
254b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
255d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
2565a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			  sizeof(*surf), 32, &brw->wm.surf_offset[unit]);
257b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
258b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
259b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_NULL;
260b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
261b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
262b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
263b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/**
264b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Sets up a surface state structure to point at the given region.
265b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * While it is only used for the front/back buffer currently, it should be
266b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * usable for further buffers when doing ARB_draw_buffer support.
267b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */
268b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void
269b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_renderbuffer_surface(struct brw_context *brw,
270b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke				 struct gl_renderbuffer *rb,
271b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke				 unsigned int unit)
272b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{
273b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_context *intel = &brw->intel;
274b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gl_context *ctx = &intel->ctx;
275b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct intel_renderbuffer *irb = intel_renderbuffer(rb);
276da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace   struct intel_region *region = irb->mt->region;
277b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   struct gen7_surface_state *surf;
2785e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   uint32_t tile_x, tile_y;
279924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul   gl_format rb_format = intel_rb_format(irb);
280b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
281d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
2825a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			  sizeof(*surf), 32, &brw->wm.surf_offset[unit]);
283b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   memset(surf, 0, sizeof(*surf));
284b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
2856781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke   if (irb->mt->align_h == 4)
2866781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke      surf->ss0.vertical_alignment = 1;
287f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt   if (irb->mt->align_w == 8)
288f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt      surf->ss0.horizontal_alignment = 1;
2896781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke
290924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul   switch (rb_format) {
291b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   case MESA_FORMAT_SARGB8:
292b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      /* without GL_EXT_framebuffer_sRGB we shouldn't bind sRGB
293b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke	 surfaces to the blend/update as sRGB */
294b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      if (ctx->Color.sRGBEnabled)
295924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul	 surf->ss0.surface_format = brw_format_for_mesa_format(rb_format);
296b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      else
297b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke	 surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
298b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke      break;
299b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   default:
300796f44d77906342e5912e7da6bdba1ba86bab9f0Eric Anholt      assert(brw_render_target_supported(intel, rb));
301924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul      surf->ss0.surface_format = brw->render_target_format[rb_format];
302924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul      if (unlikely(!brw->format_supported_as_render_target[rb_format])) {
303ca10b2d4494798405a5fd654201291944645af5dEric Anholt	 _mesa_problem(ctx, "%s: renderbuffer format %s unsupported\n",
304924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul		       __FUNCTION__, _mesa_get_format_name(rb_format));
305ca10b2d4494798405a5fd654201291944645af5dEric Anholt      }
306ca10b2d4494798405a5fd654201291944645af5dEric Anholt       break;
307b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   }
308b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
309b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss0.surface_type = BRW_SURFACE_2D;
3105e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   /* reloc */
311b17aab5753a6d14c9e757bedb186963b2dae8823Eric Anholt   surf->ss1.base_addr = intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y);
3128004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt   surf->ss1.base_addr += region->bo->offset; /* reloc */
313b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
3145e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(brw->has_surface_tile_offset);
3155e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   /* Note that the low bits of these fields are missing, so
3165e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke    * there's the possibility of getting in trouble.
3175e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke    */
3185e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(tile_x % 4 == 0);
3195e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   assert(tile_y % 2 == 0);
3205e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   surf->ss5.x_offset = tile_x / 4;
3215e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke   surf->ss5.y_offset = tile_y / 2;
3225e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke
323b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.width = rb->Width - 1;
324b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss2.height = rb->Height - 1;
325b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   gen7_set_surface_tiling(surf, region->tiling);
326b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   surf->ss3.pitch = (region->pitch * region->cpp) - 1;
327b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
3284848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   if (intel->is_haswell) {
3294848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_r = HSW_SCS_RED;
3304848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_g = HSW_SCS_GREEN;
3314848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_b = HSW_SCS_BLUE;
3324848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke      surf->ss7.shader_chanel_select_a = HSW_SCS_ALPHA;
3334848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke   }
3344848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke
335b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke   drm_intel_bo_emit_reloc(brw->intel.batch.bo,
3365a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt			   brw->wm.surf_offset[unit] +
337b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   offsetof(struct gen7_surface_state, ss1),
3388004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   region->bo,
3398004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt			   surf->ss1.base_addr - region->bo->offset,
340b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_RENDER,
341b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke			   I915_GEM_DOMAIN_RENDER);
342b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke}
343b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke
3445d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkevoid
3455d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkegen7_init_vtable_surface_functions(struct brw_context *brw)
3465d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke{
3475d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   struct intel_context *intel = &brw->intel;
3485d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke
3495d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_texture_surface = gen7_update_texture_surface;
3505d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_renderbuffer_surface = gen7_update_renderbuffer_surface;
3515d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.update_null_renderbuffer_surface =
3525d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke      gen7_update_null_renderbuffer_surface;
3535d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke   intel->vtbl.create_constant_surface = gen7_create_constant_surface;
3545d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke}
355