mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 04:50:11 +01:00
i965: Make emit_urb_writes() reserve space for GS header information.
Geometry shaders have additional header data at the beginning of their output URB entries. Shaders that use EndPrimitive() or multiple streams have a control data header; shaders with a dynamic vertex count have an additional vec4 slot to hold the 32-bit vertex count (and 96 bits of padding). Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
This commit is contained in:
parent
cb755996d9
commit
ac0a33666b
1 changed files with 16 additions and 2 deletions
|
|
@ -868,6 +868,7 @@ void
|
||||||
fs_visitor::emit_urb_writes()
|
fs_visitor::emit_urb_writes()
|
||||||
{
|
{
|
||||||
int slot, urb_offset, length;
|
int slot, urb_offset, length;
|
||||||
|
int starting_urb_offset = 0;
|
||||||
const struct brw_vue_prog_data *vue_prog_data =
|
const struct brw_vue_prog_data *vue_prog_data =
|
||||||
(const struct brw_vue_prog_data *) this->prog_data;
|
(const struct brw_vue_prog_data *) this->prog_data;
|
||||||
const struct brw_vs_prog_key *vs_key =
|
const struct brw_vs_prog_key *vs_key =
|
||||||
|
|
@ -900,8 +901,21 @@ fs_visitor::emit_urb_writes()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (stage == MESA_SHADER_GEOMETRY) {
|
||||||
|
const struct brw_gs_prog_data *gs_prog_data =
|
||||||
|
(const struct brw_gs_prog_data *) prog_data;
|
||||||
|
|
||||||
|
/* We need to increment the Global Offset to skip over the control data
|
||||||
|
* header and the extra "Vertex Count" field (1 HWord) at the beginning
|
||||||
|
* of the VUE. We're counting in OWords, so the units are doubled.
|
||||||
|
*/
|
||||||
|
starting_urb_offset = 2 * gs_prog_data->control_data_header_size_hwords;
|
||||||
|
if (gs_prog_data->static_vertex_count == -1)
|
||||||
|
starting_urb_offset += 2;
|
||||||
|
}
|
||||||
|
|
||||||
length = 0;
|
length = 0;
|
||||||
urb_offset = 0;
|
urb_offset = starting_urb_offset;
|
||||||
flush = false;
|
flush = false;
|
||||||
for (slot = 0; slot < vue_map->num_slots; slot++) {
|
for (slot = 0; slot < vue_map->num_slots; slot++) {
|
||||||
int varying = vue_map->slot_to_varying[slot];
|
int varying = vue_map->slot_to_varying[slot];
|
||||||
|
|
@ -1008,7 +1022,7 @@ fs_visitor::emit_urb_writes()
|
||||||
inst->eot = last && stage == MESA_SHADER_VERTEX;
|
inst->eot = last && stage == MESA_SHADER_VERTEX;
|
||||||
inst->mlen = length + 1;
|
inst->mlen = length + 1;
|
||||||
inst->offset = urb_offset;
|
inst->offset = urb_offset;
|
||||||
urb_offset = slot + 1;
|
urb_offset = starting_urb_offset + slot + 1;
|
||||||
length = 0;
|
length = 0;
|
||||||
flush = false;
|
flush = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue