1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2011 Intel Corporation 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_batchbuffer.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_fbo.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_mipmap_tree.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_blorp.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gen6_blorp.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \name Constants for BLORP VBO 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \{ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GEN6_BLORP_NUM_VERTICES 3 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GEN6_BLORP_NUM_VUE_ELEMS 8 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GEN6_BLORP_VBO_SIZE (GEN6_BLORP_NUM_VERTICES \ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GEN6_BLORP_NUM_VUE_ELEMS \ 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sizeof(float)) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \} */ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute masks to determine how much of draw_x and draw_y should be 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * performed using the fine adjustment of "depth coordinate offset X/Y" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (dw5 of 3DSTATE_DEPTH_BUFFER). See the emit_depthbuffer() function for 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * details. 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_compute_tile_masks(const brw_blorp_params *params, 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *tile_mask_x, uint32_t *tile_mask_y) 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t depth_mask_x, depth_mask_y, hiz_mask_x, hiz_mask_y; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_region_get_tile_masks(params->depth.mt->region, 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &depth_mask_x, &depth_mask_y, false); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_region_get_tile_masks(params->depth.mt->hiz_mt->region, 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &hiz_mask_x, &hiz_mask_y, false); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Each HiZ row represents 2 rows of pixels */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hiz_mask_y = hiz_mask_y << 1 | 1; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *tile_mask_x = depth_mask_x | hiz_mask_x; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *tile_mask_y = depth_mask_y | hiz_mask_y; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_batch_head(struct brw_context *brw, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &brw->intel.ctx; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* To ensure that the batch contains only the resolve, flush the batch 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * before beginning and after finishing emitting the resolve packets. 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Ideally, we would not need to flush for the resolve op. But, I suspect 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that it's unsafe for CMD_PIPELINE_SELECT to occur multiple times in 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a single batch, and there is no safe way to ensure that other than by 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fencing the resolve with flushes. Ideally, we would just detect if 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a batch is in progress and do the right thing, but that would require 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the ability to *safely* access brw_context::state::dirty::brw 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * outside of the brw_upload_state() codepath. 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_flush(ctx); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* CMD_PIPELINE_SELECT 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Select the 3D pipeline, as opposed to the media pipeline. 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(1); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(brw->CMD_PIPELINE_SELECT << 16); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CMD_STATE_BASE_ADDRESS 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * From the Sandy Bridge PRM, Volume 1, Part 1, Table STATE_BASE_ADDRESS: 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The following commands must be reissued following any change to the 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * base addresses: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_CC_POINTERS 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_BINDING_TABLE_POINTERS 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_SAMPLER_STATE_POINTERS 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_VIEWPORT_STATE_POINTERS 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MEDIA_STATE_POINTERS 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_state_base_address(struct brw_context *brw, 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(10); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(CMD_STATE_BASE_ADDRESS << 16 | (10 - 2)); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(1); /* GeneralStateBaseAddressModifyEnable */ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* SurfaceStateBaseAddress */ 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(intel->batch.bo, I915_GEM_DOMAIN_SAMPLER, 0, 1); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* DynamicStateBaseAddress */ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(intel->batch.bo, (I915_GEM_DOMAIN_RENDER | 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_INSTRUCTION), 0, 1); 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(1); /* IndirectObjectBaseAddress */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->use_wm_prog) { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(brw->cache.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* Instruction base address: shader kernels */ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(1); /* InstructionBaseAddress */ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(1); /* GeneralStateUpperBound */ 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Dynamic state upper bound. Although the documentation says that 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * programming it to zero will cause it to be ignored, that is a lie. 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If this isn't programmed to a real bound, the sampler border color 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pointer is rejected, causing border color to mysteriously fail. 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0xfffff001); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(1); /* IndirectObjectUpperBound*/ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(1); /* InstructionAccessUpperBound */ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_vertices(struct brw_context *brw, 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t vertex_offset; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup VBO for the rectangle primitive.. 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A rectangle primitive (3DPRIM_RECTLIST) consists of only three 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertices. The vertices reside in screen space with DirectX coordinates 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (that is, (0, 0) is the upper left corner). 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * v2 ------ implied 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | | 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | | 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * v0 ----- v1 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Since the VS is disabled, the clipper loads each VUE directly from 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the URB. This is controlled by the 3DSTATE_VERTEX_BUFFERS and 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_VERTEX_ELEMENTS packets below. The VUE contents are as follows: 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw0: Reserved, MBZ. 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw1: Render Target Array Index. The HiZ op does not use indexed 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertices, so set the dword to 0. 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw2: Viewport Index. The HiZ op disables viewport mapping and 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * scissoring, so set the dword to 0. 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw3: Point Width: The HiZ op does not emit the POINTLIST primitive, so 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * set the dword to 0. 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw4: Vertex Position X. 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw5: Vertex Position Y. 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw6: Vertex Position Z. 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dw7: Vertex Position W. 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For details, see the Sandybridge PRM, Volume 2, Part 1, Section 1.5.1 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Vertex URB Entry (VUE) Formats". 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *vertex_data; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float vertices[GEN6_BLORP_VBO_SIZE] = { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* v0 */ 0, 0, 0, 0, params->x0, params->y1, 0, 1, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* v1 */ 0, 0, 0, 0, params->x1, params->y1, 0, 1, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* v2 */ 0, 0, 0, 0, params->x0, params->y0, 0, 1, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_data = (float *) brw_state_batch(brw, AUB_TRACE_VERTEX_BUFFER, 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GEN6_BLORP_VBO_SIZE, 32, 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &vertex_offset); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(vertex_data, vertices, GEN6_BLORP_VBO_SIZE); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3DSTATE_VERTEX_BUFFERS */ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int num_buffers = 1; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int batch_length = 1 + 4 * num_buffers; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t dw0 = GEN6_VB0_ACCESS_VERTEXDATA | 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GEN6_BLORP_NUM_VUE_ELEMS * sizeof(float)) << BRW_VB0_PITCH_SHIFT; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 7) 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw0 |= GEN7_VB0_ADDRESS_MODIFYENABLE; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(batch_length); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH((_3DSTATE_VERTEX_BUFFERS << 16) | (batch_length - 2)); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(dw0); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* start address */ 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(intel->batch.bo, I915_GEM_DOMAIN_VERTEX, 0, 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_offset); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* end address */ 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(intel->batch.bo, I915_GEM_DOMAIN_VERTEX, 0, 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_offset + GEN6_BLORP_VBO_SIZE - 1); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3DSTATE_VERTEX_ELEMENTS 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fetch dwords 0 - 7 from each VUE. See the comments above where 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the vertex_bo is filled with data. 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int num_elements = 2; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int batch_length = 1 + 2 * num_elements; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(batch_length); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH((_3DSTATE_VERTEX_ELEMENTS << 16) | (batch_length - 2)); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Element 0 */ 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(GEN6_VE0_VALID | 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT | 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 << BRW_VE0_SRC_OFFSET_SHIFT); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_0_SHIFT | 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_1_SHIFT | 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_2_SHIFT | 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_3_SHIFT); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Element 1 */ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(GEN6_VE0_VALID | 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT | 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16 << BRW_VE0_SRC_OFFSET_SHIFT); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_0_SHIFT | 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_1_SHIFT | 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_2_SHIFT | 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_3_SHIFT); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_URB 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Assign the entire URB to the VS. Even though the VS disabled, URB space 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is still needed because the clipper loads the VUE's from the URB. From 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Sandybridge PRM, Volume 2, Part 1, Section 3DSTATE, 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Dword 1.15:0 "VS Number of URB Entries": 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This field is always used (even if VS Function Enable is DISABLED). 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The warning below appears in the PRM (Section 3DSTATE_URB), but we can 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * safely ignore it because this batch contains only one draw call. 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Because of URB corruption caused by allocating a previous GS unit 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * URB entry to the VS unit, software is required to send a “GS NULL 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fence” (Send URB fence with VS URB size == 1 and GS URB size == 0) 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * plus a dummy DRAW call before any case where VS will be taking over 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GS URB space. 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_urb_config(struct brw_context *brw, 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(3); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_URB << 16 | (3 - 2)); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(brw->urb.max_vs_entries << GEN6_URB_VS_ENTRIES_SHIFT); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* BLEND_STATE */ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_blend_state(struct brw_context *brw, 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t cc_blend_state_offset; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gen6_blend_state *blend = (struct gen6_blend_state *) 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_state_batch(brw, AUB_TRACE_BLEND_STATE, 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct gen6_blend_state), 64, 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &cc_blend_state_offset); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(blend, 0, sizeof(*blend)); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->blend1.pre_blend_clamp_enable = 1; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->blend1.post_blend_clamp_enable = 1; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->blend1.clamp_range = BRW_RENDERTARGET_CLAMPRANGE_FORMAT; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->blend1.write_disable_r = false; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->blend1.write_disable_g = false; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->blend1.write_disable_b = false; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->blend1.write_disable_a = false; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return cc_blend_state_offset; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* CC_STATE */ 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_cc_state(struct brw_context *brw, 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t cc_state_offset; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gen6_color_calc_state *cc = (struct gen6_color_calc_state *) 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_state_batch(brw, AUB_TRACE_CC_STATE, 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(gen6_color_calc_state), 64, 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &cc_state_offset); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(cc, 0, sizeof(*cc)); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return cc_state_offset; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param out_offset is relative to 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CMD_STATE_BASE_ADDRESS.DynamicStateBaseAddress. 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_depth_stencil_state(struct brw_context *brw, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t depthstencil_offset; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gen6_depth_stencil_state *state; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state = (struct gen6_depth_stencil_state *) 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_state_batch(brw, AUB_TRACE_DEPTH_STENCIL_STATE, 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(*state), 64, 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &depthstencil_offset); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(state, 0, sizeof(*state)); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See the following sections of the Sandy Bridge PRM, Volume 1, Part2: 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - 7.5.3.1 Depth Buffer Clear 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - 7.5.3.2 Depth Buffer Resolve 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - 7.5.3.3 Hierarchical Depth Buffer Resolve 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->ds2.depth_write_enable = 1; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->hiz_op == GEN6_HIZ_OP_DEPTH_RESOLVE) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->ds2.depth_test_enable = 1; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->ds2.depth_test_func = COMPAREFUNC_NEVER; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return depthstencil_offset; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_CC_STATE_POINTERS 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The pointer offsets are relative to 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CMD_STATE_BASE_ADDRESS.DynamicStateBaseAddress. 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The HiZ op doesn't use BLEND_STATE or COLOR_CALC_STATE. 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_cc_state_pointers(struct brw_context *brw, 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params, 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t cc_blend_state_offset, 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t depthstencil_offset, 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t cc_state_offset) 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_CC_STATE_POINTERS << 16 | (4 - 2)); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(cc_blend_state_offset | 1); /* BLEND_STATE offset */ 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(depthstencil_offset | 1); /* DEPTH_STENCIL_STATE offset */ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(cc_state_offset | 1); /* COLOR_CALC_STATE offset */ 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* WM push constants */ 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_wm_constants(struct brw_context *brw, 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_push_const_offset; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *constants = brw_state_batch(brw, AUB_TRACE_WM_CONSTANTS, 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(params->wm_push_consts), 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32, &wm_push_const_offset); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(constants, ¶ms->wm_push_consts, 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(params->wm_push_consts)); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return wm_push_const_offset; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* SURFACE_STATE for renderbuffer or texture surface (see 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw_update_renderbuffer_surface and brw_update_texture_surface) 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_surface_state(struct brw_context *brw, 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params, 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_surface_info *surface, 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t read_domains, uint32_t write_domain) 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_surf_offset; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t width = surface->width; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t height = surface->height; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surface->num_samples > 1) { 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Since gen6 uses INTEL_MSAA_LAYOUT_IMS, width and height are measured 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in samples. But SURFACE_STATE wants them in pixels, so we need to 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * divide them each by 2. 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width /= 2; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height /= 2; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_region *region = surface->mt->region; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tile_x, tile_y; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *surf = (uint32_t *) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 6 * 4, 32, 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &wm_surf_offset); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf[0] = (BRW_SURFACE_2D << BRW_SURFACE_TYPE_SHIFT | 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_SURFACE_MIPMAPLAYOUT_BELOW << BRW_SURFACE_MIPLAYOUT_SHIFT | 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_SURFACE_CUBEFACE_ENABLES | 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface->brw_surfaceformat << BRW_SURFACE_FORMAT_SHIFT); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reloc */ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf[1] = (surface->compute_tile_offsets(&tile_x, &tile_y) + 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org region->bo->offset); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf[2] = (0 << BRW_SURFACE_LOD_SHIFT | 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (width - 1) << BRW_SURFACE_WIDTH_SHIFT | 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (height - 1) << BRW_SURFACE_HEIGHT_SHIFT); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tiling = surface->map_stencil_as_y_tiled 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? BRW_SURFACE_TILED | BRW_SURFACE_TILED_Y 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : brw_get_surface_tiling_bits(region->tiling); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t pitch_bytes = region->pitch * region->cpp; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surface->map_stencil_as_y_tiled) 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitch_bytes *= 2; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf[3] = (tiling | 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 << BRW_SURFACE_DEPTH_SHIFT | 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (pitch_bytes - 1) << BRW_SURFACE_PITCH_SHIFT); 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf[4] = brw_get_surface_num_multisamples(surface->num_samples); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note that the low bits of these fields are missing, so 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * there's the possibility of getting in trouble. 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tile_x % 4 == 0); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tile_y % 2 == 0); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf[5] = ((tile_x / 4) << BRW_SURFACE_X_OFFSET_SHIFT | 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (tile_y / 2) << BRW_SURFACE_Y_OFFSET_SHIFT | 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (surface->mt->align_h == 4 ? 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0)); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit relocation to surface contents */ 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_emit_reloc(brw->intel.batch.bo, 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_surf_offset + 4, 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org region->bo, 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf[1] - region->bo->offset, 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org read_domains, write_domain); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return wm_surf_offset; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* BINDING_TABLE. See brw_wm_binding_table(). */ 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_binding_table(struct brw_context *brw, 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params, 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_surf_offset_renderbuffer, 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_surf_offset_texture) 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_bind_bo_offset; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *bind = (uint32_t *) 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_state_batch(brw, AUB_TRACE_BINDING_TABLE, 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(uint32_t) * 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_BLORP_NUM_BINDING_TABLE_ENTRIES, 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32, /* alignment */ 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &wm_bind_bo_offset); 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind[BRW_BLORP_RENDERBUFFER_BINDING_TABLE_INDEX] = 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_surf_offset_renderbuffer; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind[BRW_BLORP_TEXTURE_BINDING_TABLE_INDEX] = wm_surf_offset_texture; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return wm_bind_bo_offset; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SAMPLER_STATE. See brw_update_sampler_state(). 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_sampler_state(struct brw_context *brw, 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t sampler_offset; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_sampler_state *sampler = (struct brw_sampler_state *) 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_state_batch(brw, AUB_TRACE_SAMPLER_STATE, 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct brw_sampler_state), 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32, &sampler_offset); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(sampler, 0, sizeof(*sampler)); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.min_filter = BRW_MAPFILTER_LINEAR; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.mip_filter = BRW_MIPFILTER_NONE; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.mag_filter = BRW_MAPFILTER_LINEAR; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.min_mag_neq = 1; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set LOD bias: 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.lod_bias = 0; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.lod_preclamp = 1; /* OpenGL mode */ 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.default_color_mode = 0; /* OpenGL/DX10 mode */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set BaseMipLevel, MaxLOD, MinLOD: 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: I don't think that using firstLevel, lastLevel works, 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * because we always setup the surface state as if firstLevel == 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level zero. Probably have to subtract firstLevel from each of 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * these: 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss0.base_level = U_FIXED(0, 1); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss1.max_lod = U_FIXED(0, 6); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss1.min_lod = U_FIXED(0, 6); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss3.non_normalized_coord = 1; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss3.address_round |= BRW_ADDRESS_ROUNDING_ENABLE_U_MIN | 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_ADDRESS_ROUNDING_ENABLE_V_MIN | 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_ADDRESS_ROUNDING_ENABLE_R_MIN; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->ss3.address_round |= BRW_ADDRESS_ROUNDING_ENABLE_U_MAG | 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_ADDRESS_ROUNDING_ENABLE_V_MAG | 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_ADDRESS_ROUNDING_ENABLE_R_MAG; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return sampler_offset; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_SAMPLER_STATE_POINTERS. See upload_sampler_state_pointers(). 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_sampler_state_pointers(struct brw_context *brw, 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params, 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t sampler_offset) 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_SAMPLER_STATE_POINTERS << 16 | 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VS_SAMPLER_STATE_CHANGE | 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GS_SAMPLER_STATE_CHANGE | 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PS_SAMPLER_STATE_CHANGE | 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (4 - 2)); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* VS */ 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* GS */ 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(sampler_offset); 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_VS 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Disable vertex shader. 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_vs_disable(struct brw_context *brw, 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 6) { 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the BSpec, Volume 2a, Part 3 "Vertex Shader", Section 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_VS, Dword 5.0 "VS Function Enable": 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * [DevSNB] A pipeline flush must be programmed prior to a 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_VS command that causes the VS Function Enable to 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * toggle. Pipeline flush can be executed by sending a PIPE_CONTROL 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * command with CS stall bit set and a post sync operation. 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_emit_post_sync_nonzero_flush(intel); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(6); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_VS << 16 | (6 - 2)); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_GS 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Disable the geometry shader. 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_gs_disable(struct brw_context *brw, 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(7); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_GS << 16 | (7 - 2)); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_CLIP 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Disable the clipper. 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The BLORP op emits a rectangle primitive, which requires clipping to 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be disabled. From page 10 of the Sandy Bridge PRM Volume 2 Part 1 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Section 1.3 "3D Primitives Overview": 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * RECTLIST: 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Either the CLIP unit should be DISABLED, or the CLIP unit's Clip 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mode should be set to a value other than CLIPMODE_NORMAL. 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Also disable perspective divide. This doesn't change the clipper's 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * output, but does spare a few electrons. 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_clip_disable(struct brw_context *brw, 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_CLIP << 16 | (4 - 2)); 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(GEN6_CLIP_PERSPECTIVE_DIVIDE_DISABLE); 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_SF 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Disable ViewportTransformEnable (dw2.1) 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * From the SandyBridge PRM, Volume 2, Part 1, Section 1.3, "3D 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Primitives Overview": 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * RECTLIST: Viewport Mapping must be DISABLED (as is typical with the 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use of screen- space coordinates). 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A solid rectangle must be rendered, so set FrontFaceFillMode (dw2.4:3) 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and BackFaceFillMode (dw2.5:6) to SOLID(0). 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * From the Sandy Bridge PRM, Volume 2, Part 1, Section 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6.4.1.1 3DSTATE_SF, Field FrontFaceFillMode: 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOLID: Any triangle or rectangle object found to be front-facing 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is rendered as a solid object. This setting is required when 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (rendering rectangle (RECTLIST) objects. 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_sf_config(struct brw_context *brw, 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(20); 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_SF << 16 | (20 - 2)); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH((1 - 1) << GEN6_SF_NUM_OUTPUTS_SHIFT | /* only position */ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT | 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 << GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT); 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* dw2 */ 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(params->num_samples > 1 ? GEN6_SF_MSRAST_ON_PATTERN : 0); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 16; ++i) 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Enable or disable thread dispatch and set the HiZ op appropriately. 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_wm_config(struct brw_context *brw, 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params, 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t prog_offset, 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_blorp_prog_data *prog_data) 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t dw2, dw4, dw5, dw6; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Even when thread dispatch is disabled, max threads (dw5.25:31) must be 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * nonzero to prevent the GPU from hanging. See the valid ranges in the 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BSpec, Volume 2a.11 Windower, Section 3DSTATE_WM, Dword 5.25:31 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Maximum Number Of Threads". 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * To be safe (and to minimize extraneous code) we go ahead and fully 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * configure the WM state whether or not there is a WM program. 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw2 = dw4 = dw5 = dw6 = 0; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (params->hiz_op) { 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GEN6_HIZ_OP_DEPTH_CLEAR: 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw4 |= GEN6_WM_DEPTH_CLEAR; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GEN6_HIZ_OP_DEPTH_RESOLVE: 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw4 |= GEN6_WM_DEPTH_RESOLVE; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GEN6_HIZ_OP_HIZ_RESOLVE: 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw4 |= GEN6_WM_HIERARCHICAL_DEPTH_RESOLVE; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GEN6_HIZ_OP_NONE: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw4 |= GEN6_WM_STATISTICS_ENABLE; 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw5 |= GEN6_WM_LINE_AA_WIDTH_1_0; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw5 |= GEN6_WM_LINE_END_CAP_AA_WIDTH_0_5; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw5 |= (brw->max_wm_threads - 1) << GEN6_WM_MAX_THREADS_SHIFT; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw6 |= 0 << GEN6_WM_BARYCENTRIC_INTERPOLATION_MODE_SHIFT; /* No interp */ 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw6 |= 0 << GEN6_WM_NUM_SF_OUTPUTS_SHIFT; /* No inputs from SF */ 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->use_wm_prog) { 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw2 |= 1 << GEN6_WM_SAMPLER_COUNT_SHIFT; /* Up to 4 samplers */ 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw4 |= prog_data->first_curbe_grf << GEN6_WM_DISPATCH_START_GRF_SHIFT_0; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw5 |= GEN6_WM_16_DISPATCH_ENABLE; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw5 |= GEN6_WM_KILL_ENABLE; /* TODO: temporarily smash on */ 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw5 |= GEN6_WM_DISPATCH_ENABLE; /* We are rendering */ 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->num_samples > 1) { 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw6 |= GEN6_WM_MSRAST_ON_PATTERN; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog_data && prog_data->persample_msaa_dispatch) 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw6 |= GEN6_WM_MSDISPMODE_PERSAMPLE; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw6 |= GEN6_WM_MSDISPMODE_PERPIXEL; 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw6 |= GEN6_WM_MSRAST_OFF_PIXEL; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dw6 |= GEN6_WM_MSDISPMODE_PERSAMPLE; 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(9); 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_WM << 16 | (9 - 2)); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(params->use_wm_prog ? prog_offset : 0); 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(dw2); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* No scratch needed */ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(dw4); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(dw5); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(dw6); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* No other programs */ 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* No other programs */ 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_constant_ps(struct brw_context *brw, 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params, 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_push_const_offset) 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Make sure the push constants fill an exact integer number of 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * registers. 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sizeof(brw_blorp_wm_push_constants) % 32 == 0); 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* There must be at least one register worth of push constant data. */ 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(BRW_BLORP_NUM_PUSH_CONST_REGS > 0); 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Enable push constant buffer 0. */ 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(5); 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_CONSTANT_PS << 16 | 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GEN6_CONSTANT_BUFFER_0_ENABLE | 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (5 - 2)); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(wm_push_const_offset + (BRW_BLORP_NUM_PUSH_CONST_REGS - 1)); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3DSTATE_BINDING_TABLE_POINTERS 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_binding_table_pointers(struct brw_context *brw, 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params, 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_bind_bo_offset) 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_BINDING_TABLE_POINTERS << 16 | 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GEN6_BINDING_TABLE_MODIFY_PS | 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (4 - 2)); 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* vs -- ignored */ 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* gs -- ignored */ 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(wm_bind_bo_offset); /* wm/ps */ 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_depth_stencil_config(struct brw_context *brw, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t draw_x = params->depth.x_offset; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t draw_y = params->depth.y_offset; 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tile_mask_x, tile_mask_y; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_compute_tile_masks(params, &tile_mask_x, &tile_mask_y); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3DSTATE_DEPTH_BUFFER */ 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tile_x = draw_x & tile_mask_x; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tile_y = draw_y & tile_mask_y; 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset = 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_region_get_aligned_offset(params->depth.mt->region, 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_x & ~tile_mask_x, 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_y & ~tile_mask_y, false); 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* According to the Sandy Bridge PRM, volume 2 part 1, pp326-327 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (3DSTATE_DEPTH_BUFFER dw5), in the documentation for "Depth 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Coordinate Offset X/Y": 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "The 3 LSBs of both offsets must be zero to ensure correct 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * alignment" 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We have no guarantee that tile_x and tile_y are correctly aligned, 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * since they are determined by the mipmap layout, which is only aligned 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to multiples of 4. 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * So, to avoid hanging the GPU, just smash the low order 3 bits of 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tile_x and tile_y to 0. This is a temporary workaround until we come 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * up with a better solution. 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile_x &= ~7; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile_y &= ~7; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_emit_post_sync_nonzero_flush(intel); 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_emit_depth_stall_flushes(intel); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(7); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (7 - 2)); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t pitch_bytes = 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params->depth.mt->region->pitch * params->depth.mt->region->cpp; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH((pitch_bytes - 1) | 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params->depth_format << 18 | 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << 21 | /* separate stencil enable */ 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << 22 | /* hiz enable */ 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_TILEWALK_YMAJOR << 26 | 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << 27 | /* y-tiled */ 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_SURFACE_2D << 29); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(params->depth.mt->region->bo, 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset); 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(BRW_SURFACE_MIPMAPLAYOUT_BELOW << 1 | 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (params->depth.width + tile_x - 1) << 6 | 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (params->depth.height + tile_y - 1) << 19); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(tile_x | 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile_y << 16); 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3DSTATE_HIER_DEPTH_BUFFER */ 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_region *hiz_region = params->depth.mt->hiz_mt->region; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t hiz_offset = 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_region_get_aligned_offset(hiz_region, 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_x & ~tile_mask_x, 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (draw_y & ~tile_mask_y) / 2, false); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(3); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH((_3DSTATE_HIER_DEPTH_BUFFER << 16) | (3 - 2)); 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(hiz_region->pitch * hiz_region->cpp - 1); 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(hiz_region->bo, 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hiz_offset); 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3DSTATE_STENCIL_BUFFER */ 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(3); 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH((_3DSTATE_STENCIL_BUFFER << 16) | (3 - 2)); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_depth_disable(struct brw_context *brw, 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(7); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (7 - 2)); 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH((BRW_DEPTHFORMAT_D32_FLOAT << 18) | 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (BRW_SURFACE_NULL << 29)); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_CLEAR_PARAMS 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * From the Sandybridge PRM, Volume 2, Part 1, Section 3DSTATE_CLEAR_PARAMS: 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * [DevSNB] 3DSTATE_CLEAR_PARAMS packet must follow the DEPTH_BUFFER_STATE 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * packet when HiZ is enabled and the DEPTH_BUFFER_STATE changes. 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_clear_params(struct brw_context *brw, 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(2); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_CLEAR_PARAMS << 16 | 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GEN5_DEPTH_CLEAR_VALID | 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (2 - 2)); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(params->depth.mt ? params->depth.mt->depth_clear_value : 0); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_DRAWING_RECTANGLE */ 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_drawing_rectangle(struct brw_context *brw, 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_DRAWING_RECTANGLE << 16 | (4 - 2)); 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(((params->x1 - 1) & 0xffff) | 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((params->y1 - 1) << 16)); 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DSTATE_VIEWPORT_STATE_POINTERS */ 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_viewport_state(struct brw_context *brw, 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_cc_viewport *ccv; 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t cc_vp_offset; 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ccv = (struct brw_cc_viewport *)brw_state_batch(brw, AUB_TRACE_CC_VP_STATE, 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(*ccv), 32, 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &cc_vp_offset); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ccv->min_depth = 0.0; 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ccv->max_depth = 1.0; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_VIEWPORT_STATE_POINTERS << 16 | (4 - 2) | 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GEN6_CC_VIEWPORT_MODIFY); 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* clip VP */ 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); /* SF VP */ 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(cc_vp_offset); 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3DPRIMITIVE */ 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_emit_primitive(struct brw_context *brw, 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(6); 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(CMD_3D_PRIM << 16 | (6 - 2) | 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _3DPRIM_RECTLIST << GEN4_3DPRIM_TOPOLOGY_TYPE_SHIFT | 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GEN4_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(3); /* vertex count per instance */ 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(1); /* instance count */ 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \brief Execute a blit or render pass operation. 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * To execute the operation, this function manually constructs and emits a 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * batch to draw a rectangle primitive. The batchbuffer is flushed before 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * constructing and after emitting the batch. 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function alters no GL state. 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_blorp_exec(struct intel_context *intel, 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const brw_blorp_params *params) 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &intel->ctx; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = brw_context(ctx); 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_blorp_prog_data *prog_data = NULL; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t cc_blend_state_offset = 0; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t cc_state_offset = 0; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t depthstencil_offset; 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_push_const_offset = 0; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_bind_bo_offset = 0; 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t prog_offset = params->get_wm_prog(brw, &prog_data); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_batch_head(brw, params); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_emit_3dstate_multisample(brw, params->num_samples); 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_emit_3dstate_sample_mask(brw, params->num_samples, 1.0, false); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_state_base_address(brw, params); 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_vertices(brw, params); 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_urb_config(brw, params); 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->use_wm_prog) { 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cc_blend_state_offset = gen6_blorp_emit_blend_state(brw, params); 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cc_state_offset = gen6_blorp_emit_cc_state(brw, params); 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthstencil_offset = gen6_blorp_emit_depth_stencil_state(brw, params); 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_cc_state_pointers(brw, params, cc_blend_state_offset, 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthstencil_offset, cc_state_offset); 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->use_wm_prog) { 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_surf_offset_renderbuffer; 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t wm_surf_offset_texture; 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t sampler_offset; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_push_const_offset = gen6_blorp_emit_wm_constants(brw, params); 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_surf_offset_renderbuffer = 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_surface_state(brw, params, ¶ms->dst, 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_RENDER, 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_RENDER); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_surf_offset_texture = 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_surface_state(brw, params, ¶ms->src, 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_SAMPLER, 0); 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_bind_bo_offset = 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_binding_table(brw, params, 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_surf_offset_renderbuffer, 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wm_surf_offset_texture); 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_offset = gen6_blorp_emit_sampler_state(brw, params); 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_sampler_state_pointers(brw, params, sampler_offset); 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_vs_disable(brw, params); 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_gs_disable(brw, params); 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_clip_disable(brw, params); 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_sf_config(brw, params); 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->use_wm_prog) 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_constant_ps(brw, params, wm_push_const_offset); 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_wm_config(brw, params, prog_offset, prog_data); 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->use_wm_prog) 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_binding_table_pointers(brw, params, wm_bind_bo_offset); 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_viewport_state(brw, params); 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (params->depth.mt) 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_depth_stencil_config(brw, params); 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_depth_disable(brw, params); 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_clear_params(brw, params); 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_drawing_rectangle(brw, params); 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_blorp_emit_primitive(brw, params); 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See comments above at first invocation of intel_flush() in 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * gen6_blorp_emit_batch_head(). 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_flush(ctx); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Be safe. */ 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->state.dirty.brw = ~0; 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->state.dirty.cache = ~0; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107