• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
upload_vs_state(struct brw_context * brw)33 upload_vs_state(struct brw_context *brw)
34 {
35    const struct gen_device_info *devinfo = &brw->screen->devinfo;
36    const struct brw_stage_state *stage_state = &brw->vs.base;
37    const struct brw_stage_prog_data *prog_data = stage_state->prog_data;
38    const struct brw_vue_prog_data *vue_prog_data =
39       brw_vue_prog_data(stage_state->prog_data);
40    uint32_t floating_point_mode = 0;
41    const int max_threads_shift = brw->is_haswell ?
42       HSW_VS_MAX_THREADS_SHIFT : GEN6_VS_MAX_THREADS_SHIFT;
43 
44    if (!brw->is_haswell && !brw->is_baytrail)
45       gen7_emit_vs_workaround_flush(brw);
46 
47    if (prog_data->use_alt_mode)
48       floating_point_mode = GEN6_VS_FLOATING_POINT_MODE_ALT;
49 
50    BEGIN_BATCH(6);
51    OUT_BATCH(_3DSTATE_VS << 16 | (6 - 2));
52    OUT_BATCH(stage_state->prog_offset);
53    OUT_BATCH(floating_point_mode |
54 	     ((ALIGN(stage_state->sampler_count, 4)/4) <<
55               GEN6_VS_SAMPLER_COUNT_SHIFT) |
56              ((prog_data->binding_table.size_bytes / 4) <<
57               GEN6_VS_BINDING_TABLE_ENTRY_COUNT_SHIFT));
58 
59    if (prog_data->total_scratch) {
60       OUT_RELOC(stage_state->scratch_bo,
61 		I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
62 		ffs(stage_state->per_thread_scratch) - 11);
63    } else {
64       OUT_BATCH(0);
65    }
66 
67    OUT_BATCH((prog_data->dispatch_grf_start_reg <<
68               GEN6_VS_DISPATCH_START_GRF_SHIFT) |
69 	     (vue_prog_data->urb_read_length << GEN6_VS_URB_READ_LENGTH_SHIFT) |
70 	     (0 << GEN6_VS_URB_ENTRY_READ_OFFSET_SHIFT));
71 
72    OUT_BATCH(((devinfo->max_vs_threads - 1) << max_threads_shift) |
73 	     GEN6_VS_STATISTICS_ENABLE |
74 	     GEN6_VS_ENABLE);
75    ADVANCE_BATCH();
76 }
77 
78 const struct brw_tracked_state gen7_vs_state = {
79    .dirty = {
80       .mesa  = 0,
81       .brw   = BRW_NEW_BATCH |
82                BRW_NEW_BLORP |
83                BRW_NEW_CONTEXT |
84                BRW_NEW_VS_PROG_DATA,
85    },
86    .emit = upload_vs_state,
87 };
88