diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 2f48027ea97..030add2e2ff 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -4002,14 +4002,13 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT /* Account for the loading offset due to index buffers. Instead of * reloading all sources correct it with the startvertex parameter. */ - drawPrimitive(device, vertex_count, start_vertex, 0, NULL); + drawPrimitive(device, vertex_count, start_vertex, FALSE, NULL); return WINED3D_OK; } HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count) { struct wined3d_buffer *index_buffer; - UINT index_size = 2; GLuint vbo; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; @@ -4039,11 +4038,6 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic } vbo = index_buffer->buffer_object; - if (device->stateBlock->state.index_format == WINED3DFMT_R16_UINT) - index_size = 2; - else - index_size = 4; - if (!gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX] && device->stateBlock->state.load_base_vertex_index != device->stateBlock->state.base_vertex_index) { @@ -4051,7 +4045,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic device_invalidate_state(device, STATE_BASEVERTEXINDEX); } - drawPrimitive(device, index_count, start_idx, index_size, + drawPrimitive(device, index_count, start_idx, TRUE, vbo ? NULL : index_buffer->resource.allocatedMemory); return WINED3D_OK; @@ -4090,7 +4084,7 @@ HRESULT CDECL wined3d_device_draw_primitive_up(struct wined3d_device *device, UI /* TODO: Only mark dirty if drawing from a different UP address */ device_invalidate_state(device, STATE_STREAMSRC); - drawPrimitive(device, vertex_count, 0, 0, NULL); + drawPrimitive(device, vertex_count, 0, FALSE, NULL); /* MSDN specifies stream zero settings must be set to NULL */ stream->buffer = NULL; @@ -4108,7 +4102,6 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive_up(struct wined3d_device *de { struct wined3d_stream_state *stream; struct wined3d_buffer *vb, *ib; - UINT index_size; TRACE("device %p, index_count %u, index_data %p, index_data_format %s, stream_data %p, stream_stride %u.\n", device, index_count, index_data, debug_d3dformat(index_data_format_id), stream_data, stream_stride); @@ -4119,11 +4112,6 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive_up(struct wined3d_device *de return WINED3DERR_INVALIDCALL; } - if (index_data_format_id == WINED3DFMT_R16_UINT) - index_size = 2; - else - index_size = 4; - stream = &device->stateBlock->state.streams[0]; vb = stream->buffer; stream->buffer = (struct wined3d_buffer *)stream_data; @@ -4132,6 +4120,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive_up(struct wined3d_device *de stream->offset = 0; stream->stride = stream_stride; device->stateBlock->state.user_stream = TRUE; + device->stateBlock->state.index_format = index_data_format_id; /* Set to 0 as per msdn. Do it now due to the stream source loading during drawPrimitive */ device->stateBlock->state.base_vertex_index = 0; @@ -4144,7 +4133,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive_up(struct wined3d_device *de device_invalidate_state(device, STATE_STREAMSRC); device_invalidate_state(device, STATE_INDEXBUFFER); - drawPrimitive(device, index_count, 0, index_size, index_data); + drawPrimitive(device, index_count, 0, TRUE, index_data); /* MSDN specifies stream zero settings and index buffer must be set to NULL */ stream->buffer = NULL; @@ -4174,7 +4163,7 @@ HRESULT CDECL wined3d_device_draw_primitive_strided(struct wined3d_device *devic device->stateBlock->state.base_vertex_index = 0; device->up_strided = strided_data; - drawPrimitive(device, vertex_count, 0, 0, NULL); + drawPrimitive(device, vertex_count, 0, FALSE, NULL); device->up_strided = NULL; /* Invalidate the states again to make sure the values from the stateblock @@ -4191,7 +4180,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive_strided(struct wined3d_devic UINT index_count, const struct wined3d_strided_data *strided_data, UINT vertex_count, const void *index_data, enum wined3d_format_id index_data_format_id) { - UINT index_size = index_data_format_id == WINED3DFMT_R32_UINT ? 4 : 2; + enum wined3d_format_id prev_idx_format; /* Mark the state dirty until we have nicer tracking * its fine to change baseVertexIndex because that call is only called by ddraw which does not need @@ -4201,11 +4190,14 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive_strided(struct wined3d_devic device_invalidate_state(device, STATE_STREAMSRC); device_invalidate_state(device, STATE_INDEXBUFFER); + prev_idx_format = device->stateBlock->state.index_format; + device->stateBlock->state.index_format = index_data_format_id; device->stateBlock->state.user_stream = TRUE; device->stateBlock->state.base_vertex_index = 0; device->up_strided = strided_data; - drawPrimitive(device, index_count, 0, index_size, index_data); + drawPrimitive(device, index_count, 0, TRUE, index_data); device->up_strided = NULL; + device->stateBlock->state.index_format = prev_idx_format; device_invalidate_state(device, STATE_VDECL); device_invalidate_state(device, STATE_STREAMSRC); diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 3a2b26b6b1f..136c8f5b6eb 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -575,7 +575,7 @@ static void remove_vbos(const struct wined3d_gl_info *gl_info, } /* Routine common to the draw primitive and draw indexed primitive routines */ -void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartIdx, UINT idxSize, const void *idxData) +void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartIdx, BOOL indexed, const void *idxData) { const struct wined3d_state *state = &device->stateBlock->state; struct wined3d_context *context; @@ -669,6 +669,14 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId BOOL emulation = FALSE; const struct wined3d_stream_info *stream_info = &device->strided_streams; struct wined3d_stream_info stridedlcl; + UINT idx_size; + + if (!indexed) + idx_size = 0; + else if (state->index_format == WINED3DFMT_R16_UINT) + idx_size = 2; + else + idx_size = 4; if (!use_vs(state)) { @@ -719,23 +727,23 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId TRACE("Using immediate mode with vertex shaders for half float emulation\n"); } drawStridedSlowVs(context->gl_info, state, stream_info, - index_count, glPrimType, idxData, idxSize, StartIdx); + index_count, glPrimType, idxData, idx_size, StartIdx); } else { drawStridedSlow(device, context, stream_info, index_count, - glPrimType, idxData, idxSize, StartIdx); + glPrimType, idxData, idx_size, StartIdx); } } else if (device->instancedDraw) { /* Instancing emulation with mixing immediate mode and arrays */ drawStridedInstanced(context->gl_info, state, stream_info, - index_count, glPrimType, idxData, idxSize, StartIdx, base_vertex_index); + index_count, glPrimType, idxData, idx_size, StartIdx, base_vertex_index); } else { - drawStridedFast(context->gl_info, glPrimType, index_count, idxSize, idxData, StartIdx, base_vertex_index); + drawStridedFast(context->gl_info, glPrimType, index_count, idx_size, idxData, StartIdx, base_vertex_index); } } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 1e5f87c2bc4..94da4380e6e 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -932,7 +932,7 @@ struct wined3d_stream_info /* Routine common to the draw primitive and draw indexed primitive routines */ void drawPrimitive(struct wined3d_device *device, UINT index_count, - UINT start_idx, UINT idxBytes, const void *idxData) DECLSPEC_HIDDEN; + UINT start_idx, BOOL indexed, const void *idxData) DECLSPEC_HIDDEN; DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN; typedef void (WINE_GLAPI *glAttribFunc)(const void *data);