Переглянути джерело

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>
tags/11.1-branchpoint
Kenneth Graunke 10 роки тому
джерело
коміт
ac0a33666b
1 змінених файлів з 16 додано та 2 видалено
  1. 16
    2
      src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

+ 16
- 2
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp Переглянути файл

@@ -868,6 +868,7 @@ void
fs_visitor::emit_urb_writes()
{
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 *) this->prog_data;
const struct brw_vs_prog_key *vs_key =
@@ -900,8 +901,21 @@ fs_visitor::emit_urb_writes()
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;
urb_offset = 0;
urb_offset = starting_urb_offset;
flush = false;
for (slot = 0; slot < vue_map->num_slots; 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->mlen = length + 1;
inst->offset = urb_offset;
urb_offset = slot + 1;
urb_offset = starting_urb_offset + slot + 1;
length = 0;
flush = false;
}

Завантаження…
Відмінити
Зберегти