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