iris: some draw info, vbs, sample mask

This commit is contained in:
Kenneth Graunke
2018-01-10 00:19:29 -08:00
parent d6ad9f4732
commit efea4d96d9
3 changed files with 103 additions and 20 deletions

View File

@@ -50,6 +50,8 @@ enum iris_dirty {
IRIS_DIRTY_LINE_STIPPLE = (1ull << 11),
IRIS_DIRTY_VERTEX_ELEMENTS = (1ull << 12),
IRIS_DIRTY_MULTISAMPLE = (1ull << 13),
IRIS_DIRTY_VERTEX_BUFFERS = (1ull << 14),
IRIS_DIRTY_SAMPLE_MASK = (1ull << 15),
};
struct iris_depth_stencil_alpha_state;
@@ -63,10 +65,12 @@ struct iris_context {
uint64_t dirty;
unsigned num_viewports; // XXX: can viewports + scissors be different?
unsigned num_scissors;
unsigned sample_mask;
struct iris_blend_state *cso_blend;
struct iris_rasterizer_state *cso_rast;
struct iris_depth_stencil_alpha_state *cso_zsa;
struct iris_vertex_element_state *cso_vertex_elements;
struct iris_vertex_buffer_state *cso_vertex_buffers;
struct iris_viewport_state *cso_vp;
struct iris_depth_state *cso_depth;
struct pipe_blend_color blend_color;
@@ -92,7 +96,9 @@ iris_create_context(struct pipe_screen *screen, void *priv, unsigned flags);
void iris_init_program_functions(struct pipe_context *ctx);
void iris_init_state_functions(struct pipe_context *ctx);
void iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch);
void iris_upload_render_state(struct iris_context *ice,
struct iris_batch *batch,
struct pipe_draw_info *draw);
void iris_destroy_state(struct iris_context *ice);
#endif

View File

@@ -66,7 +66,7 @@ iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
{
struct iris_context *ice = (struct iris_context *) ctx;
iris_upload_render_state(ice);
iris_upload_render_state(ice, draw);
#if 0
l3 configuration

View File

@@ -155,6 +155,32 @@ UNUSED static void pipe_asserts()
#undef PIPE_ASSERT
}
static unsigned
translate_prim_type(enum pipe_prim_type prim, uint8_t verts_per_patch)
{
assert(prim == PIPE_PRIM_PATCHES || verts_per_patch == 0);
static const unsigned map[] = {
[PIPE_PRIM_POINTS] = _3DPRIM_POINTLIST,
[PIPE_PRIM_LINES] = _3DPRIM_LINELIST,
[PIPE_PRIM_LINE_LOOP] = _3DPRIM_LINELOOP,
[PIPE_PRIM_LINE_STRIP] = _3DPRIM_LINESTRIP,
[PIPE_PRIM_TRIANGLES] = _3DPRIM_TRILIST,
[PIPE_PRIM_TRIANGLE_STRIP] = _3DPRIM_TRISTRIP,
[PIPE_PRIM_TRIANGLE_FAN] = _3DPRIM_TRIFAN,
[PIPE_PRIM_QUADS] = _3DPRIM_QUADLIST,
[PIPE_PRIM_QUAD_STRIP] = _3DPRIM_QUADSTRIP,
[PIPE_PRIM_POLYGON] = _3DPRIM_POLYGON,
[PIPE_PRIM_LINES_ADJACENCY] = _3DPRIM_LINELIST_ADJ,
[PIPE_PRIM_LINE_STRIP_ADJACENCY] = _3DPRIM_LINESTRIP_ADJ,
[PIPE_PRIM_TRIANGLES_ADJACENCY] = _3DPRIM_TRILIST_ADJ,
[PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = _3DPRIM_TRISTRIP_ADJ,
[PIPE_PRIM_PATCHES] = _3DPRIM_PATCHLIST_1 - 1,
};
return map[prim] + verts_per_patch;
}
static unsigned
translate_compare_func(enum pipe_compare_func pipe_func)
{
@@ -827,8 +853,12 @@ iris_set_polygon_stipple(struct pipe_context *ctx,
}
static void
iris_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
iris_set_sample_mask(struct pipe_context *ctx, unsigned sample_mask)
{
struct iris_context *ice = (struct iris_context *) ctx;
ice->state.sample_mask = sample_mask;
ice->state.dirty |= IRIS_DIRTY_SAMPLE_MASK;
}
static void
@@ -1072,6 +1102,7 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
unsigned start_slot, unsigned count,
const struct pipe_vertex_buffer *buffers)
{
struct iris_context *ice = (struct iris_context *) ctx;
struct iris_vertex_buffer_state *cso =
malloc(sizeof(struct iris_vertex_buffer_state));
@@ -1105,7 +1136,7 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
vb_pack_dest += GENX(VERTEX_BUFFER_STATE_length);
}
/* XXX: actually do something with this! */
ice->state.dirty |= IRIS_DIRTY_VERTEX_BUFFERS;
}
struct iris_vertex_element_state {
@@ -1205,7 +1236,9 @@ iris_set_stream_output_targets(struct pipe_context *ctx,
}
void
iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch)
iris_upload_render_state(struct iris_context *ice,
struct iris_batch *batch,
struct pipe_draw_info *draw)
{
const uint64_t dirty = ice->state.dirty;
@@ -1295,6 +1328,13 @@ iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch)
}
}
if (dirty & IRIS_DIRTY_VERTEX_BUFFERS) {
struct iris_vertex_buffer_state *cso = ice->state.cso_vertex_buffers;
// XXX: address!!!
iris_batch_emit(batch, cso->vertex_buffers,
sizeof(uint32_t) * cso->length);
}
if (dirty & IRIS_DIRTY_VERTEX_ELEMENTS) {
struct iris_vertex_element_state *cso = ice->state.cso_vertex_elements;
iris_batch_emit(batch, cso->vertex_elements, sizeof(uint32_t) *
@@ -1317,6 +1357,58 @@ iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch)
}
}
if (dirty & IRIS_DIRTY_SAMPLE_MASK) {
iris_emit_cmd(batch, GENX(3DSTATE_SAMPLE_MASK), ms) {
ms.SampleMask = ice->state.sample_mask;
}
}
if (1) {
iris_emit_cmd(batch, GENX(3DSTATE_VF_TOPOLOGY), topo) {
topo.PrimitiveTopologyType =
translate_prim_type(draw->mode, draw->vertices_per_patch);
}
}
if (1) {
iris_emit_cmd(batch, GENX(3DSTATE_VF), vf) {
vf.IndexedDrawCutIndexEnable = draw->primitive_restart;
vf.CutIndex = draw->restart_index;
}
}
// draw->index_size > 0
if (1) {
struct iris_resource *res = (struct iris_resource *)draw->index.resource;
assert(!draw->has_user_indices);
iris_emit_cmd(batch, GENX(3DSTATE_INDEX_BUFFER), ib) {
ib.IndexFormat = draw->index_size;
ib.MOCS = MOCS_WB;
ib.BufferSize = res->bo->size;
// XXX: gah, addresses :( need two different combine address funcs
// ib.BufferStartingAddress = res->bo;
}
assert(!draw->indirect); // XXX: indirect support
iris_emit_cmd(batch, GENX(3DPRIMITIVE), prim) {
prim.StartInstanceLocation = draw->start_instance;
prim.InstanceCount = draw->instance_count;
// XXX: this is probably bonkers.
prim.StartVertexLocation = draw->start;
if (draw->index_size) {
prim.BaseVertexLocation += draw->index_bias;
} else {
prim.StartVertexLocation += draw->index_bias;
}
//prim.BaseVertexLocation = ...;
}
}
#if 0
l3 configuration
@@ -1370,21 +1462,6 @@ iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch)
3DSTATE_STENCIL_BUFFER
3DSTATE_CLEAR_PARAMS
-> iris_framebuffer_state?
3DSTATE_VF_TOPOLOGY
-> pipe_draw_info (prim_mode)
3DSTATE_VF
-> pipe_draw_info (restart_index, primitive_restart)
3DSTATE_INDEX_BUFFER
-> pipe_draw_info (index)
3DSTATE_VERTEX_BUFFERS
-> pipe_vertex_buffer (set_vertex_buffer hook)
3DSTATE_VF_COMPONENT_PACKING
-> TODO ???
3DPRIMITIVE
-> pipe_draw_info
#endif
}