ilo: update VF related functions for Gen8

This commit is contained in:
Chia-I Wu
2015-02-10 07:10:20 +08:00
parent a57805cb75
commit 0e3381154c
2 changed files with 157 additions and 42 deletions
-29
View File
@@ -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,
+157 -13
View File
@@ -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)