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