brw_blorp.cpp revision 602e9a0f3727b036caf3a7b228fe90d36d832ea7
1/* 2 * Copyright © 2012 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24#include "intel_fbo.h" 25 26#include "brw_blorp.h" 27#include "brw_defines.h" 28#include "gen6_blorp.h" 29#include "gen7_blorp.h" 30 31brw_blorp_mip_info::brw_blorp_mip_info() 32 : mt(NULL), 33 level(0), 34 layer(0), 35 width(0), 36 height(0) 37{ 38} 39 40brw_blorp_surface_info::brw_blorp_surface_info() 41 : map_stencil_as_y_tiled(false), 42 num_samples(0) 43{ 44} 45 46void 47brw_blorp_mip_info::set(struct intel_mipmap_tree *mt, 48 unsigned int level, unsigned int layer) 49{ 50 intel_miptree_check_level_layer(mt, level, layer); 51 52 this->mt = mt; 53 this->level = level; 54 this->layer = layer; 55 this->width = mt->level[level].width; 56 this->height = mt->level[level].height; 57} 58 59void 60brw_blorp_surface_info::set(struct brw_context *brw, 61 struct intel_mipmap_tree *mt, 62 unsigned int level, unsigned int layer) 63{ 64 brw_blorp_mip_info::set(mt, level, layer); 65 this->num_samples = mt->num_samples; 66 this->array_spacing_lod0 = mt->array_spacing_lod0; 67 this->map_stencil_as_y_tiled = false; 68 this->msaa_layout = mt->msaa_layout; 69 70 switch (mt->format) { 71 case MESA_FORMAT_S8: 72 /* The miptree is a W-tiled stencil buffer. Surface states can't be set 73 * up for W tiling, so we'll need to use Y tiling and have the WM 74 * program swizzle the coordinates. 75 */ 76 this->map_stencil_as_y_tiled = true; 77 this->brw_surfaceformat = BRW_SURFACEFORMAT_R8_UNORM; 78 break; 79 case MESA_FORMAT_X8_Z24: 80 case MESA_FORMAT_Z32_FLOAT: 81 /* The miptree consists of 32 bits per pixel, arranged either as 24-bit 82 * depth values interleaved with 8 "don't care" bits, or as 32-bit 83 * floating point depth values. Since depth values don't require any 84 * blending, it doesn't matter how we interpret the bit pattern as long 85 * as we copy the right amount of data, so just map it as 8-bit BGRA. 86 */ 87 this->brw_surfaceformat = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; 88 break; 89 case MESA_FORMAT_Z16: 90 /* The miptree consists of 16 bits per pixel of depth data. Since depth 91 * values don't require any blending, it doesn't matter how we interpret 92 * the bit pattern as long as we copy the right amount of data, so just 93 * map is as 8-bit RG. 94 */ 95 this->brw_surfaceformat = BRW_SURFACEFORMAT_R8G8_UNORM; 96 break; 97 default: 98 /* Blorp blits don't support any sort of format conversion, so we can 99 * safely assume that the same format is being used for the source and 100 * destination. Therefore the format must be supported as a render 101 * target, even if this is the source image. So we can convert to a 102 * surface format using brw->render_target_format. 103 */ 104 assert(brw->format_supported_as_render_target[mt->format]); 105 this->brw_surfaceformat = brw->render_target_format[mt->format]; 106 break; 107 } 108} 109 110void 111brw_blorp_mip_info::get_draw_offsets(uint32_t *draw_x, uint32_t *draw_y) const 112{ 113 /* Construct a dummy renderbuffer just to extract tile offsets. */ 114 struct intel_renderbuffer rb; 115 rb.mt = mt; 116 rb.mt_level = level; 117 rb.mt_layer = layer; 118 intel_renderbuffer_set_draw_offset(&rb); 119 *draw_x = rb.draw_x; 120 *draw_y = rb.draw_y; 121} 122 123brw_blorp_params::brw_blorp_params() 124 : x0(0), 125 y0(0), 126 x1(0), 127 y1(0), 128 depth_format(0), 129 hiz_op(GEN6_HIZ_OP_NONE), 130 num_samples(0), 131 use_wm_prog(false) 132{ 133} 134 135extern "C" { 136void 137intel_hiz_exec(struct intel_context *intel, struct intel_mipmap_tree *mt, 138 unsigned int level, unsigned int layer, gen6_hiz_op op) 139{ 140 brw_hiz_op_params params(mt, level, layer, op); 141 brw_blorp_exec(intel, ¶ms); 142} 143 144} /* extern "C" */ 145 146void 147brw_blorp_exec(struct intel_context *intel, const brw_blorp_params *params) 148{ 149 switch (intel->gen) { 150 case 6: 151 gen6_blorp_exec(intel, params); 152 break; 153 case 7: 154 gen7_blorp_exec(intel, params); 155 break; 156 default: 157 /* BLORP is not supported before Gen6. */ 158 assert(false); 159 break; 160 } 161} 162 163brw_hiz_op_params::brw_hiz_op_params(struct intel_mipmap_tree *mt, 164 unsigned int level, 165 unsigned int layer, 166 gen6_hiz_op op) 167{ 168 this->hiz_op = op; 169 170 depth.set(mt, level, layer); 171 x1 = depth.width; 172 y1 = depth.height; 173 174 assert(mt->hiz_mt != NULL); 175 176 switch (mt->format) { 177 case MESA_FORMAT_Z16: depth_format = BRW_DEPTHFORMAT_D16_UNORM; break; 178 case MESA_FORMAT_Z32_FLOAT: depth_format = BRW_DEPTHFORMAT_D32_FLOAT; break; 179 case MESA_FORMAT_X8_Z24: depth_format = BRW_DEPTHFORMAT_D24_UNORM_X8_UINT; break; 180 default: assert(0); break; 181 } 182} 183 184uint32_t 185brw_hiz_op_params::get_wm_prog(struct brw_context *brw, 186 brw_blorp_prog_data **prog_data) const 187{ 188 return 0; 189} 190