From: Chia-I Wu Date: Mon, 9 Feb 2015 23:10:20 +0000 (+0800) Subject: ilo: update VF related functions for Gen8 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0e3381154cfcc265495344c1c7b3e98dbbbe6183;p=mesa.git ilo: update VF related functions for Gen8 --- diff --git a/src/gallium/drivers/ilo/ilo_builder_3d.h b/src/gallium/drivers/ilo/ilo_builder_3d.h index 4f43bdcff04..e37294256d0 100644 --- a/src/gallium/drivers/ilo/ilo_builder_3d.h +++ b/src/gallium/drivers/ilo/ilo_builder_3d.h @@ -34,35 +34,6 @@ #include "ilo_builder_3d_top.h" #include "ilo_builder_3d_bottom.h" -/** - * Translate a pipe primitive type to the matching hardware primitive type. - */ -static inline int -gen6_3d_translate_pipe_prim(unsigned prim) -{ - static const int prim_mapping[ILO_PRIM_MAX] = { - [PIPE_PRIM_POINTS] = GEN6_3DPRIM_POINTLIST, - [PIPE_PRIM_LINES] = GEN6_3DPRIM_LINELIST, - [PIPE_PRIM_LINE_LOOP] = GEN6_3DPRIM_LINELOOP, - [PIPE_PRIM_LINE_STRIP] = GEN6_3DPRIM_LINESTRIP, - [PIPE_PRIM_TRIANGLES] = GEN6_3DPRIM_TRILIST, - [PIPE_PRIM_TRIANGLE_STRIP] = GEN6_3DPRIM_TRISTRIP, - [PIPE_PRIM_TRIANGLE_FAN] = GEN6_3DPRIM_TRIFAN, - [PIPE_PRIM_QUADS] = GEN6_3DPRIM_QUADLIST, - [PIPE_PRIM_QUAD_STRIP] = GEN6_3DPRIM_QUADSTRIP, - [PIPE_PRIM_POLYGON] = GEN6_3DPRIM_POLYGON, - [PIPE_PRIM_LINES_ADJACENCY] = GEN6_3DPRIM_LINELIST_ADJ, - [PIPE_PRIM_LINE_STRIP_ADJACENCY] = GEN6_3DPRIM_LINESTRIP_ADJ, - [PIPE_PRIM_TRIANGLES_ADJACENCY] = GEN6_3DPRIM_TRILIST_ADJ, - [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = GEN6_3DPRIM_TRISTRIP_ADJ, - [ILO_PRIM_RECTANGLES] = GEN6_3DPRIM_RECTLIST, - }; - - assert(prim_mapping[prim]); - - return prim_mapping[prim]; -} - static inline void gen6_3DPRIMITIVE(struct ilo_builder *builder, const struct pipe_draw_info *info, diff --git a/src/gallium/drivers/ilo/ilo_builder_3d_top.h b/src/gallium/drivers/ilo/ilo_builder_3d_top.h index 7714301ba30..78e03c36b8d 100644 --- a/src/gallium/drivers/ilo/ilo_builder_3d_top.h +++ b/src/gallium/drivers/ilo/ilo_builder_3d_top.h @@ -350,6 +350,96 @@ gen6_3DSTATE_VF_STATISTICS(struct ilo_builder *builder, ilo_builder_batch_write(builder, cmd_len, &dw0); } +/** + * Translate a pipe primitive type to the matching hardware primitive type. + */ +static inline int +gen6_3d_translate_pipe_prim(unsigned prim) +{ + static const int prim_mapping[ILO_PRIM_MAX] = { + [PIPE_PRIM_POINTS] = GEN6_3DPRIM_POINTLIST, + [PIPE_PRIM_LINES] = GEN6_3DPRIM_LINELIST, + [PIPE_PRIM_LINE_LOOP] = GEN6_3DPRIM_LINELOOP, + [PIPE_PRIM_LINE_STRIP] = GEN6_3DPRIM_LINESTRIP, + [PIPE_PRIM_TRIANGLES] = GEN6_3DPRIM_TRILIST, + [PIPE_PRIM_TRIANGLE_STRIP] = GEN6_3DPRIM_TRISTRIP, + [PIPE_PRIM_TRIANGLE_FAN] = GEN6_3DPRIM_TRIFAN, + [PIPE_PRIM_QUADS] = GEN6_3DPRIM_QUADLIST, + [PIPE_PRIM_QUAD_STRIP] = GEN6_3DPRIM_QUADSTRIP, + [PIPE_PRIM_POLYGON] = GEN6_3DPRIM_POLYGON, + [PIPE_PRIM_LINES_ADJACENCY] = GEN6_3DPRIM_LINELIST_ADJ, + [PIPE_PRIM_LINE_STRIP_ADJACENCY] = GEN6_3DPRIM_LINESTRIP_ADJ, + [PIPE_PRIM_TRIANGLES_ADJACENCY] = GEN6_3DPRIM_TRILIST_ADJ, + [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = GEN6_3DPRIM_TRISTRIP_ADJ, + [ILO_PRIM_RECTANGLES] = GEN6_3DPRIM_RECTLIST, + }; + + assert(prim_mapping[prim]); + + return prim_mapping[prim]; +} + +static inline void +gen8_3DSTATE_VF_TOPOLOGY(struct ilo_builder *builder, unsigned pipe_prim) +{ + const uint8_t cmd_len = 2; + const int prim = gen6_3d_translate_pipe_prim(pipe_prim); + uint32_t *dw; + + ILO_DEV_ASSERT(builder->dev, 8, 8); + + ilo_builder_batch_pointer(builder, cmd_len, &dw); + + dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_VF_TOPOLOGY) | (cmd_len - 2); + dw[1] = prim; +} + +static inline void +gen8_3DSTATE_VF_INSTANCING(struct ilo_builder *builder, + int vb_index, uint32_t step_rate) +{ + const uint8_t cmd_len = 3; + uint32_t *dw; + + ILO_DEV_ASSERT(builder->dev, 8, 8); + + ilo_builder_batch_pointer(builder, cmd_len, &dw); + + dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_VF_INSTANCING) | (cmd_len - 2); + dw[1] = vb_index; + if (step_rate) + dw[1] |= GEN8_INSTANCING_DW1_ENABLE; + dw[2] = step_rate; +} + +static inline void +gen8_3DSTATE_VF_SGVS(struct ilo_builder *builder, + bool vid_enable, int vid_ve, int vid_comp, + bool iid_enable, int iid_ve, int iid_comp) +{ + const uint8_t cmd_len = 2; + uint32_t *dw; + + ILO_DEV_ASSERT(builder->dev, 8, 8); + + ilo_builder_batch_pointer(builder, cmd_len, &dw); + + dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_VF_SGVS) | (cmd_len - 2); + dw[1] = 0; + + if (iid_enable) { + dw[1] |= GEN8_SGVS_DW1_IID_ENABLE | + vid_comp << GEN8_SGVS_DW1_IID_VE_COMP__SHIFT | + vid_ve << GEN8_SGVS_DW1_IID_VE_INDEX__SHIFT; + } + + if (vid_enable) { + dw[1] |= GEN8_SGVS_DW1_VID_ENABLE | + vid_comp << GEN8_SGVS_DW1_VID_VE_COMP__SHIFT | + vid_ve << GEN8_SGVS_DW1_VID_VE_INDEX__SHIFT; + } +} + static inline void gen6_3DSTATE_VERTEX_BUFFERS(struct ilo_builder *builder, const struct ilo_ve_state *ve, @@ -359,7 +449,7 @@ gen6_3DSTATE_VERTEX_BUFFERS(struct ilo_builder *builder, uint32_t *dw; unsigned pos, hw_idx; - ILO_DEV_ASSERT(builder->dev, 6, 7.5); + ILO_DEV_ASSERT(builder->dev, 6, 8); /* * From the Sandy Bridge PRM, volume 2 part 1, page 82: @@ -385,31 +475,44 @@ gen6_3DSTATE_VERTEX_BUFFERS(struct ilo_builder *builder, dw[0] = hw_idx << GEN6_VB_DW0_INDEX__SHIFT; + if (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) + dw[0] |= GEN7_VB_DW0_ADDR_MODIFIED; + if (instance_divisor) dw[0] |= GEN6_VB_DW0_ACCESS_INSTANCEDATA; else dw[0] |= GEN6_VB_DW0_ACCESS_VERTEXDATA; - if (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) - dw[0] |= GEN7_VB_DW0_ADDR_MODIFIED; - /* use null vb if there is no buffer or the stride is out of range */ - if (cso->buffer && cso->stride <= 2048) { + if (!cso->buffer || cso->stride > 2048) { + dw[0] |= GEN6_VB_DW0_IS_NULL; + dw[1] = 0; + dw[2] = 0; + dw[3] = (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) ? + 0 : instance_divisor; + + continue; + } + + dw[0] |= cso->stride << GEN6_VB_DW0_PITCH__SHIFT; + + if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) { + const struct ilo_buffer *buf = ilo_buffer(cso->buffer); + const uint32_t start_offset = cso->buffer_offset; + + ilo_builder_batch_reloc64(builder, pos + 1, + buf->bo, start_offset, 0); + dw[3] = buf->bo_size; + } else { const struct ilo_buffer *buf = ilo_buffer(cso->buffer); const uint32_t start_offset = cso->buffer_offset; const uint32_t end_offset = buf->bo_size - 1; - dw[0] |= cso->stride << GEN6_VB_DW0_PITCH__SHIFT; + dw[3] = instance_divisor; + ilo_builder_batch_reloc(builder, pos + 1, buf->bo, start_offset, 0); ilo_builder_batch_reloc(builder, pos + 2, buf->bo, end_offset, 0); } - else { - dw[0] |= 1 << 13; - dw[1] = 0; - dw[2] = 0; - } - - dw[3] = instance_divisor; dw += 4; pos += 4; @@ -553,6 +656,47 @@ gen6_3DSTATE_INDEX_BUFFER(struct ilo_builder *builder, ilo_builder_batch_reloc(builder, pos + 2, buf->bo, end_offset, 0); } +static inline void +gen8_3DSTATE_INDEX_BUFFER(struct ilo_builder *builder, + const struct ilo_ib_state *ib) +{ + const uint8_t cmd_len = 5; + struct ilo_buffer *buf = ilo_buffer(ib->hw_resource); + int format; + uint32_t *dw; + unsigned pos; + + ILO_DEV_ASSERT(builder->dev, 8, 8); + + if (!buf) + return; + + switch (ib->hw_index_size) { + case 4: + format = GEN8_IB_DW1_FORMAT_DWORD; + break; + case 2: + format = GEN8_IB_DW1_FORMAT_WORD; + break; + case 1: + format = GEN8_IB_DW1_FORMAT_BYTE; + break; + default: + assert(!"unknown index size"); + format = GEN8_IB_DW1_FORMAT_BYTE; + break; + } + + pos = ilo_builder_batch_pointer(builder, cmd_len, &dw); + + dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_INDEX_BUFFER) | (cmd_len - 2); + dw[1] = format; + dw[4] = buf->bo_size; + + /* ignore ib->offset here in favor of adjusting 3DPRIMITIVE */ + ilo_builder_batch_reloc64(builder, pos + 2, buf->bo, 0, 0); +} + static inline void gen6_3DSTATE_VS(struct ilo_builder *builder, const struct ilo_shader_state *vs)