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