Home | History | Annotate | Download | only in i965
      1 /*
      2  * Copyright  2011 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 
     24 #include "brw_context.h"
     25 #include "brw_state.h"
     26 #include "brw_defines.h"
     27 #include "brw_util.h"
     28 #include "program/prog_parameter.h"
     29 #include "program/prog_statevars.h"
     30 #include "intel_batchbuffer.h"
     31 
     32 static void
     33 upload_vs_state(struct brw_context *brw)
     34 {
     35    struct intel_context *intel = &brw->intel;
     36    uint32_t floating_point_mode = 0;
     37    const int max_threads_shift = brw->intel.is_haswell ?
     38       HSW_VS_MAX_THREADS_SHIFT : GEN6_VS_MAX_THREADS_SHIFT;
     39 
     40    gen7_emit_vs_workaround_flush(intel);
     41 
     42    /* BRW_NEW_VS_BINDING_TABLE */
     43    BEGIN_BATCH(2);
     44    OUT_BATCH(_3DSTATE_BINDING_TABLE_POINTERS_VS << 16 | (2 - 2));
     45    OUT_BATCH(brw->vs.bind_bo_offset);
     46    ADVANCE_BATCH();
     47 
     48    /* CACHE_NEW_SAMPLER */
     49    BEGIN_BATCH(2);
     50    OUT_BATCH(_3DSTATE_SAMPLER_STATE_POINTERS_VS << 16 | (2 - 2));
     51    OUT_BATCH(brw->sampler.offset);
     52    ADVANCE_BATCH();
     53 
     54    if (brw->vs.push_const_size == 0) {
     55       /* Disable the push constant buffers. */
     56       BEGIN_BATCH(7);
     57       OUT_BATCH(_3DSTATE_CONSTANT_VS << 16 | (7 - 2));
     58       OUT_BATCH(0);
     59       OUT_BATCH(0);
     60       OUT_BATCH(0);
     61       OUT_BATCH(0);
     62       OUT_BATCH(0);
     63       OUT_BATCH(0);
     64       ADVANCE_BATCH();
     65    } else {
     66       BEGIN_BATCH(7);
     67       OUT_BATCH(_3DSTATE_CONSTANT_VS << 16 | (7 - 2));
     68       OUT_BATCH(brw->vs.push_const_size);
     69       OUT_BATCH(0);
     70       /* Pointer to the VS constant buffer.  Covered by the set of
     71        * state flags from gen6_prepare_wm_contants
     72        */
     73       OUT_BATCH(brw->vs.push_const_offset);
     74       OUT_BATCH(0);
     75       OUT_BATCH(0);
     76       OUT_BATCH(0);
     77       ADVANCE_BATCH();
     78    }
     79 
     80    /* Use ALT floating point mode for ARB vertex programs, because they
     81     * require 0^0 == 1.
     82     */
     83    if (intel->ctx.Shader.CurrentVertexProgram == NULL)
     84       floating_point_mode = GEN6_VS_FLOATING_POINT_MODE_ALT;
     85 
     86    BEGIN_BATCH(6);
     87    OUT_BATCH(_3DSTATE_VS << 16 | (6 - 2));
     88    OUT_BATCH(brw->vs.prog_offset);
     89    OUT_BATCH(floating_point_mode |
     90 	     ((ALIGN(brw->sampler.count, 4)/4) << GEN6_VS_SAMPLER_COUNT_SHIFT));
     91 
     92    if (brw->vs.prog_data->total_scratch) {
     93       OUT_RELOC(brw->vs.scratch_bo,
     94 		I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
     95 		ffs(brw->vs.prog_data->total_scratch) - 11);
     96    } else {
     97       OUT_BATCH(0);
     98    }
     99 
    100    OUT_BATCH((1 << GEN6_VS_DISPATCH_START_GRF_SHIFT) |
    101 	     (brw->vs.prog_data->urb_read_length << GEN6_VS_URB_READ_LENGTH_SHIFT) |
    102 	     (0 << GEN6_VS_URB_ENTRY_READ_OFFSET_SHIFT));
    103 
    104    OUT_BATCH(((brw->max_vs_threads - 1) << max_threads_shift) |
    105 	     GEN6_VS_STATISTICS_ENABLE |
    106 	     GEN6_VS_ENABLE);
    107    ADVANCE_BATCH();
    108 }
    109 
    110 const struct brw_tracked_state gen7_vs_state = {
    111    .dirty = {
    112       .mesa  = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS,
    113       .brw   = (BRW_NEW_CONTEXT |
    114 		BRW_NEW_VERTEX_PROGRAM |
    115 		BRW_NEW_VS_BINDING_TABLE |
    116 		BRW_NEW_BATCH),
    117       .cache = CACHE_NEW_VS_PROG | CACHE_NEW_SAMPLER
    118    },
    119    .emit = upload_vs_state,
    120 };
    121