Module: Mesa Branch: master Commit: 9168a376924c0331a83a8fe6e244708b95bfd25b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9168a376924c0331a83a8fe6e244708b95bfd25b
Author: Axel Davy <[email protected]> Date: Sat Mar 6 17:14:46 2021 +0100 st/nine: Refactor DrawPrimitiveUp . Use the same fonction as DrawPrimitive . Drop the user vbuf path . Avoid setting NULL vertexbuffer to the context Signed-off-by: Axel Davy <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9451> --- src/gallium/frontends/nine/device9.c | 118 +++++++++++++++++--------------- src/gallium/frontends/nine/device9.h | 1 - src/gallium/frontends/nine/nine_state.c | 31 +-------- src/gallium/frontends/nine/nine_state.h | 13 ++-- 4 files changed, 70 insertions(+), 93 deletions(-) diff --git a/src/gallium/frontends/nine/device9.c b/src/gallium/frontends/nine/device9.c index 2de8d50ef68..d224b072f51 100644 --- a/src/gallium/frontends/nine/device9.c +++ b/src/gallium/frontends/nine/device9.c @@ -512,7 +512,6 @@ NineDevice9_ctor( struct NineDevice9 *This, /* Allocate upload helper for drivers that suck (from st pov ;). */ - This->driver_caps.user_vbufs = GET_PCAP(USER_VERTEX_BUFFERS) && !This->csmt_active; This->driver_caps.user_sw_vbufs = This->screen_sw->get_param(This->screen_sw, PIPE_CAP_USER_VERTEX_BUFFERS); This->vertex_uploader = This->csmt_active ? This->pipe_secondary->stream_uploader : This->context.pipe->stream_uploader; This->driver_caps.window_space_position_support = GET_PCAP(TGSI_VS_WINDOW_SPACE_POSITION); @@ -2955,6 +2954,9 @@ NineDevice9_DrawIndexedPrimitive( struct NineDevice9 *This, return D3D_OK; } +static void +NineDevice9_SetStreamSourceNULL( struct NineDevice9 *This ); + HRESULT NINE_WINAPI NineDevice9_DrawPrimitiveUP( struct NineDevice9 *This, D3DPRIMITIVETYPE PrimitiveType, @@ -2962,7 +2964,8 @@ NineDevice9_DrawPrimitiveUP( struct NineDevice9 *This, const void *pVertexStreamZeroData, UINT VertexStreamZeroStride ) { - struct pipe_vertex_buffer vtxbuf; + struct pipe_resource *resource = NULL; + unsigned buffer_offset; DBG("iface %p, PrimitiveType %u, PrimitiveCount %u, data %p, stride %u\n", This, PrimitiveType, PrimitiveCount, @@ -2972,32 +2975,25 @@ NineDevice9_DrawPrimitiveUP( struct NineDevice9 *This, D3DERR_INVALIDCALL); user_assert(PrimitiveCount, D3D_OK); - vtxbuf.stride = VertexStreamZeroStride; - vtxbuf.buffer_offset = 0; - vtxbuf.is_user_buffer = true; - vtxbuf.buffer.user = pVertexStreamZeroData; - - if (!This->driver_caps.user_vbufs) { - vtxbuf.is_user_buffer = false; - vtxbuf.buffer.resource = NULL; - u_upload_data(This->vertex_uploader, - 0, - (prim_count_to_vertex_count(PrimitiveType, PrimitiveCount)) * VertexStreamZeroStride, /* XXX */ - 4, - pVertexStreamZeroData, - &vtxbuf.buffer_offset, - &vtxbuf.buffer.resource); - u_upload_unmap(This->vertex_uploader); - } + u_upload_data(This->vertex_uploader, + 0, + (prim_count_to_vertex_count(PrimitiveType, PrimitiveCount)) * VertexStreamZeroStride, + 64, + pVertexStreamZeroData, + &buffer_offset, + &resource); + u_upload_unmap(This->vertex_uploader); + + nine_context_set_stream_source_apply(This, 0, resource, + buffer_offset, VertexStreamZeroStride); + pipe_resource_reference(&resource, NULL); NineBeforeDraw(This); - nine_context_draw_primitive_from_vtxbuf(This, PrimitiveType, PrimitiveCount, &vtxbuf); + nine_context_draw_primitive(This, PrimitiveType, 0, PrimitiveCount); NineAfterDraw(This); - pipe_vertex_buffer_unreference(&vtxbuf); - NineDevice9_PauseRecording(This); - NineDevice9_SetStreamSource(This, 0, NULL, 0, 0); + NineDevice9_SetStreamSourceNULL(This); NineDevice9_ResumeRecording(This); return D3D_OK; @@ -3015,6 +3011,9 @@ NineDevice9_DrawIndexedPrimitiveUP( struct NineDevice9 *This, UINT VertexStreamZeroStride ) { struct pipe_vertex_buffer vbuf; + unsigned index_size = (IndexDataFormat == D3DFMT_INDEX16) ? 2 : 4; + struct pipe_resource *ibuf = NULL; + unsigned base; DBG("iface %p, PrimitiveType %u, MinVertexIndex %u, NumVertices %u " "PrimitiveCount %u, pIndexData %p, IndexDataFormat %u " @@ -3029,41 +3028,30 @@ NineDevice9_DrawIndexedPrimitiveUP( struct NineDevice9 *This, IndexDataFormat == D3DFMT_INDEX32, D3DERR_INVALIDCALL); user_assert(PrimitiveCount, D3D_OK); + base = MinVertexIndex * VertexStreamZeroStride; + vbuf.is_user_buffer = false; + vbuf.buffer.resource = NULL; vbuf.stride = VertexStreamZeroStride; - vbuf.buffer_offset = 0; - vbuf.is_user_buffer = true; - vbuf.buffer.user = pVertexStreamZeroData; - - unsigned index_size = (IndexDataFormat == D3DFMT_INDEX16) ? 2 : 4; - struct pipe_resource *ibuf = NULL; - - if (!This->driver_caps.user_vbufs) { - const unsigned base = MinVertexIndex * VertexStreamZeroStride; - vbuf.is_user_buffer = false; - vbuf.buffer.resource = NULL; - u_upload_data(This->vertex_uploader, - base, - NumVertices * VertexStreamZeroStride, /* XXX */ - 4, - (const uint8_t *)pVertexStreamZeroData + base, - &vbuf.buffer_offset, - &vbuf.buffer.resource); - u_upload_unmap(This->vertex_uploader); - /* Won't be used: */ - vbuf.buffer_offset -= base; - } + u_upload_data(This->vertex_uploader, + base, + NumVertices * VertexStreamZeroStride, /* XXX */ + 64, + (const uint8_t *)pVertexStreamZeroData + base, + &vbuf.buffer_offset, + &vbuf.buffer.resource); + u_upload_unmap(This->vertex_uploader); + /* Won't be used: */ + vbuf.buffer_offset -= base; unsigned index_offset = 0; - if (This->csmt_active) { - u_upload_data(This->pipe_secondary->stream_uploader, - 0, - (prim_count_to_vertex_count(PrimitiveType, PrimitiveCount)) * index_size, - 4, - pIndexData, - &index_offset, - &ibuf); - u_upload_unmap(This->pipe_secondary->stream_uploader); - } + u_upload_data(This->pipe_secondary->stream_uploader, + 0, + (prim_count_to_vertex_count(PrimitiveType, PrimitiveCount)) * index_size, + 64, + pIndexData, + &index_offset, + &ibuf); + u_upload_unmap(This->pipe_secondary->stream_uploader); NineBeforeDraw(This); nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf(This, PrimitiveType, @@ -3082,7 +3070,7 @@ NineDevice9_DrawIndexedPrimitiveUP( struct NineDevice9 *This, NineDevice9_PauseRecording(This); NineDevice9_SetIndices(This, NULL); - NineDevice9_SetStreamSource(This, 0, NULL, 0, 0); + NineDevice9_SetStreamSourceNULL(This); NineDevice9_ResumeRecording(This); return D3D_OK; @@ -3629,6 +3617,24 @@ NineDevice9_SetStreamSource( struct NineDevice9 *This, return D3D_OK; } +static void +NineDevice9_SetStreamSourceNULL( struct NineDevice9 *This ) +{ + struct nine_state *state = This->update; + + DBG("This=%p\n", This); + + state->vtxbuf[0].stride = 0; + state->vtxbuf[0].buffer_offset = 0; + + if (!state->stream[0]) + return; + + NineBindBufferToDevice(This, + (struct NineBuffer9 **)&state->stream[0], + NULL); +} + HRESULT NINE_WINAPI NineDevice9_GetStreamSource( struct NineDevice9 *This, UINT StreamNumber, diff --git a/src/gallium/frontends/nine/device9.h b/src/gallium/frontends/nine/device9.h index 876728e0105..ba9295206de 100644 --- a/src/gallium/frontends/nine/device9.h +++ b/src/gallium/frontends/nine/device9.h @@ -128,7 +128,6 @@ struct NineDevice9 } cursor; struct { - boolean user_vbufs; boolean user_sw_vbufs; boolean window_space_position_support; boolean vs_integer; diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index 0d1f670e946..55df570d31c 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -1390,12 +1390,6 @@ nine_context_set_texture_apply(struct NineDevice9 *device, struct pipe_resource *res, struct pipe_sampler_view *view0, struct pipe_sampler_view *view1); -static void -nine_context_set_stream_source_apply(struct NineDevice9 *device, - UINT StreamNumber, - struct pipe_resource *res, - UINT OffsetInBytes, - UINT Stride); static void nine_context_set_indices_apply(struct NineDevice9 *device, @@ -2410,30 +2404,6 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive, context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1); } -CSMT_ITEM_NO_WAIT(nine_context_draw_primitive_from_vtxbuf, - ARG_VAL(D3DPRIMITIVETYPE, PrimitiveType), - ARG_VAL(UINT, PrimitiveCount), - ARG_BIND_VBUF(struct pipe_vertex_buffer, vtxbuf)) -{ - struct nine_context *context = &device->context; - struct pipe_draw_info info; - struct pipe_draw_start_count draw; - - nine_update_state(device); - - init_draw_info(&info, &draw, device, PrimitiveType, PrimitiveCount); - info.index_size = 0; - draw.start = 0; - info.index_bias = 0; - info.min_index = 0; - info.max_index = draw.count - 1; - info.index.resource = NULL; - - context->pipe->set_vertex_buffers(context->pipe, 0, 1, 0, false, vtxbuf); - - context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1); -} - CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf, ARG_VAL(D3DPRIMITIVETYPE, PrimitiveType), ARG_VAL(UINT, MinVertexIndex), @@ -2465,6 +2435,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf, info.index.user = user_ibuf; context->pipe->set_vertex_buffers(context->pipe, 0, 1, 0, false, vbuf); + context->changed.vtxbuf |= 1; context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1); } diff --git a/src/gallium/frontends/nine/nine_state.h b/src/gallium/frontends/nine/nine_state.h index d42bfbfefc9..b6b63877558 100644 --- a/src/gallium/frontends/nine/nine_state.h +++ b/src/gallium/frontends/nine/nine_state.h @@ -353,6 +353,13 @@ struct NineDevice9; * will append work to a worker thread when possible. Only the worker * thread can access struct nine_context. */ +void +nine_context_set_stream_source_apply(struct NineDevice9 *device, + UINT StreamNumber, + struct pipe_resource *res, + UINT OffsetInBytes, + UINT Stride); + void nine_context_set_render_state(struct NineDevice9 *device, D3DRENDERSTATETYPE State, @@ -514,12 +521,6 @@ nine_context_draw_indexed_primitive(struct NineDevice9 *device, UINT StartIndex, UINT PrimitiveCount); -void -nine_context_draw_primitive_from_vtxbuf(struct NineDevice9 *device, - D3DPRIMITIVETYPE PrimitiveType, - UINT PrimitiveCount, - struct pipe_vertex_buffer *vtxbuf); - void nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf(struct NineDevice9 *device, D3DPRIMITIVETYPE PrimitiveType, _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
