16b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke/* 26b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * Copyright © 2011 Intel Corporation 36b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * 46b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * Permission is hereby granted, free of charge, to any person obtaining a 56b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * copy of this software and associated documentation files (the "Software"), 66b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * to deal in the Software without restriction, including without limitation 76b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * the rights to use, copy, modify, merge, publish, distribute, sublicense, 86b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * and/or sell copies of the Software, and to permit persons to whom the 96b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * Software is furnished to do so, subject to the following conditions: 106b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * 116b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * The above copyright notice and this permission notice (including the next 126b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * paragraph) shall be included in all copies or substantial portions of the 136b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * Software. 146b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * 156b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 166b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 176b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 186b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 196b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 206b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 216b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * IN THE SOFTWARE. 226b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke */ 236b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke 246b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke#include "brw_context.h" 256b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke#include "brw_state.h" 266b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke#include "brw_defines.h" 276b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke#include "brw_util.h" 286b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke#include "program/prog_parameter.h" 296b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke#include "program/prog_statevars.h" 306b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke#include "intel_batchbuffer.h" 316b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke 326b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunkestatic void 336b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunkeupload_vs_state(struct brw_context *brw) 346b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke{ 356b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke struct intel_context *intel = &brw->intel; 36f40c6b2a992f3ca796826a47743c0c80232d7ab2Paul Berry uint32_t floating_point_mode = 0; 371b3a199097190a0bf857eb17c12949fa2b456d9bKenneth Graunke const int max_threads_shift = brw->intel.is_haswell ? 381b3a199097190a0bf857eb17c12949fa2b456d9bKenneth Graunke HSW_VS_MAX_THREADS_SHIFT : GEN6_VS_MAX_THREADS_SHIFT; 396b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke 40709f50928e1d4df755ffb90ec9f33ba6c9605a32Kenneth Graunke gen7_emit_vs_workaround_flush(intel); 41709f50928e1d4df755ffb90ec9f33ba6c9605a32Kenneth Graunke 4207e00b3040d6da381595c65db5afe597f20d99fcEric Anholt /* BRW_NEW_VS_BINDING_TABLE */ 43706dbf85f15d42c320481dabe2a3db0c2cbbebb8Kenneth Graunke BEGIN_BATCH(2); 44706dbf85f15d42c320481dabe2a3db0c2cbbebb8Kenneth Graunke OUT_BATCH(_3DSTATE_BINDING_TABLE_POINTERS_VS << 16 | (2 - 2)); 4507e00b3040d6da381595c65db5afe597f20d99fcEric Anholt OUT_BATCH(brw->vs.bind_bo_offset); 46706dbf85f15d42c320481dabe2a3db0c2cbbebb8Kenneth Graunke ADVANCE_BATCH(); 47706dbf85f15d42c320481dabe2a3db0c2cbbebb8Kenneth Graunke 4829fc0d8c8af486d79298650b7e07dee16b3ec4baKenneth Graunke /* CACHE_NEW_SAMPLER */ 4929fc0d8c8af486d79298650b7e07dee16b3ec4baKenneth Graunke BEGIN_BATCH(2); 5029fc0d8c8af486d79298650b7e07dee16b3ec4baKenneth Graunke OUT_BATCH(_3DSTATE_SAMPLER_STATE_POINTERS_VS << 16 | (2 - 2)); 5129fc0d8c8af486d79298650b7e07dee16b3ec4baKenneth Graunke OUT_BATCH(brw->sampler.offset); 5229fc0d8c8af486d79298650b7e07dee16b3ec4baKenneth Graunke ADVANCE_BATCH(); 5329fc0d8c8af486d79298650b7e07dee16b3ec4baKenneth Graunke 546b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke if (brw->vs.push_const_size == 0) { 556b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke /* Disable the push constant buffers. */ 566b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke BEGIN_BATCH(7); 576b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(_3DSTATE_CONSTANT_VS << 16 | (7 - 2)); 586b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 596b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 606b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 616b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 626b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 636b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 646b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke ADVANCE_BATCH(); 656b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke } else { 666b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke BEGIN_BATCH(7); 676b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(_3DSTATE_CONSTANT_VS << 16 | (7 - 2)); 686b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(brw->vs.push_const_size); 696b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 706b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke /* Pointer to the VS constant buffer. Covered by the set of 716b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke * state flags from gen6_prepare_wm_contants 726b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke */ 736b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(brw->vs.push_const_offset); 746b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 756b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 766b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(0); 776b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke ADVANCE_BATCH(); 786b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke } 796b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke 80f40c6b2a992f3ca796826a47743c0c80232d7ab2Paul Berry /* Use ALT floating point mode for ARB vertex programs, because they 81f40c6b2a992f3ca796826a47743c0c80232d7ab2Paul Berry * require 0^0 == 1. 82f40c6b2a992f3ca796826a47743c0c80232d7ab2Paul Berry */ 83f40c6b2a992f3ca796826a47743c0c80232d7ab2Paul Berry if (intel->ctx.Shader.CurrentVertexProgram == NULL) 84f40c6b2a992f3ca796826a47743c0c80232d7ab2Paul Berry floating_point_mode = GEN6_VS_FLOATING_POINT_MODE_ALT; 85f40c6b2a992f3ca796826a47743c0c80232d7ab2Paul Berry 866b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke BEGIN_BATCH(6); 876b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH(_3DSTATE_VS << 16 | (6 - 2)); 88c173541d9769d41a85cc899bc49699a3587df4bfEric Anholt OUT_BATCH(brw->vs.prog_offset); 8951b1d412ec5d0699d182b895daacb3b78da328adKenneth Graunke OUT_BATCH(floating_point_mode | 9051b1d412ec5d0699d182b895daacb3b78da328adKenneth Graunke ((ALIGN(brw->sampler.count, 4)/4) << GEN6_VS_SAMPLER_COUNT_SHIFT)); 91314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt 92314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt if (brw->vs.prog_data->total_scratch) { 93314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt OUT_RELOC(brw->vs.scratch_bo, 94314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 95314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt ffs(brw->vs.prog_data->total_scratch) - 11); 96314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt } else { 97314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt OUT_BATCH(0); 98314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt } 99314c2574ff6e562a6cfc5fb84980f092e495a948Eric Anholt 1006b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke OUT_BATCH((1 << GEN6_VS_DISPATCH_START_GRF_SHIFT) | 1016b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke (brw->vs.prog_data->urb_read_length << GEN6_VS_URB_READ_LENGTH_SHIFT) | 1026b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke (0 << GEN6_VS_URB_ENTRY_READ_OFFSET_SHIFT)); 1036b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke 1041b3a199097190a0bf857eb17c12949fa2b456d9bKenneth Graunke OUT_BATCH(((brw->max_vs_threads - 1) << max_threads_shift) | 1056b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke GEN6_VS_STATISTICS_ENABLE | 1066b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke GEN6_VS_ENABLE); 1076b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke ADVANCE_BATCH(); 1086b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke} 1096b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke 1106b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunkeconst struct brw_tracked_state gen7_vs_state = { 1116b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke .dirty = { 1126b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke .mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS, 113f497906ec0c01ec714d77bfcc2f0a38da5dafcc2Kenneth Graunke .brw = (BRW_NEW_CONTEXT | 1146b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke BRW_NEW_VERTEX_PROGRAM | 115706dbf85f15d42c320481dabe2a3db0c2cbbebb8Kenneth Graunke BRW_NEW_VS_BINDING_TABLE | 1166b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke BRW_NEW_BATCH), 11729fc0d8c8af486d79298650b7e07dee16b3ec4baKenneth Graunke .cache = CACHE_NEW_VS_PROG | CACHE_NEW_SAMPLER 1186b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke }, 1196b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke .emit = upload_vs_state, 1206b2010df7d55ad9feacbbcf708a83a66cdf91aafKenneth Graunke}; 121