Thanks. I'm amending this: diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c index 5dc24d6..f26552c 100644 --- a/src/gallium/state_trackers/nine/device9.c +++ b/src/gallium/state_trackers/nine/device9.c @@ -2913,6 +2913,7 @@ NineDevice9_DrawIndexedPrimitiveUP( struct NineDevice9 *This, PrimitiveCount, &vbuf, ibuf, + ibuf ? NULL : pIndexData, index_offset, index_size); NineAfterDraw(This); diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c index 8bfa7fc..0fc4c83 100644 --- a/src/gallium/state_trackers/nine/nine_state.c +++ b/src/gallium/state_trackers/nine/nine_state.c @@ -2580,7 +2580,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive,
init_draw_info(&info, device, PrimitiveType, PrimitiveCount); info.index_size = context->index_size; - info.start = StartIndex; + info.start = context->index_offset / context->index_size + StartIndex; info.index_bias = BaseVertexIndex; /* These don't include index bias: */ info.min_index = MinVertexIndex; @@ -2619,6 +2619,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf, ARG_VAL(UINT, PrimitiveCount), ARG_BIND_VBUF(struct pipe_vertex_buffer, vbuf), ARG_BIND_RES(struct pipe_resource, ibuf), + ARG_VAL(void *, user_ibuf), ARG_VAL(UINT, index_offset), ARG_VAL(UINT, index_size)) { @@ -2633,8 +2634,12 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf, info.index_bias = 0; info.min_index = MinVertexIndex; info.max_index = MinVertexIndex + NumVertices - 1; - info.has_user_indices = false; - info.index.resource = ibuf; + info.has_user_indices = ibuf == NULL; + if (ibuf) + info.index.resource = ibuf; + else + info.index.user = user_ibuf; + context->pipe->set_vertex_buffers(context->pipe, 0, 1, vbuf); context->pipe->draw_vbo(context->pipe, &info); diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h index 9eb04f6..f5fd1ef 100644 --- a/src/gallium/state_trackers/nine/nine_state.h +++ b/src/gallium/state_trackers/nine/nine_state.h @@ -518,6 +518,7 @@ nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf(struct NineDevice9 *devic UINT PrimitiveCount, struct pipe_vertex_buffer *vbuf, struct pipe_resource *ibuf, + void *user_ibuf, unsigned index_offset, unsigned index_size); Marek On Sun, Apr 30, 2017 at 10:23 AM, Axel Davy <axel.d...@normalesup.org> wrote: > Hi Marek, > > Here is probably the second mistake: > I guess you should change info.start to take into account the offset of > the index buffer. > > Yours, > > Axel Davy > > On 29/04/2017 01:12, Marek Olšák wrote: > >> CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive, >> ARG_VAL(D3DPRIMITIVETYPE, PrimitiveType), >> @@ -2588,73 +2572,77 @@ CSMT_ITEM_NO_WAIT(nine_context >> _draw_indexed_primitive, >> ARG_VAL(UINT, NumVertices), >> ARG_VAL(UINT, StartIndex), >> ARG_VAL(UINT, PrimitiveCount)) >> { >> struct nine_context *context = &device->context; >> struct pipe_draw_info info; >> nine_update_state(device); >> init_draw_info(&info, device, PrimitiveType, PrimitiveCount); >> - info.indexed = TRUE; >> + info.index_size = context->index_size; >> info.start = StartIndex; >> info.index_bias = BaseVertexIndex; >> /* These don't include index bias: */ >> info.min_index = MinVertexIndex; >> info.max_index = MinVertexIndex + NumVertices - 1; >> + info.index.resource = context->idxbuf; >> context->pipe->draw_vbo(context->pipe, &info); >> } >> > > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev