diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 02d0144b916..9443877faab 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -494,12 +494,12 @@ static void drawStridedSlowVs(const struct wined3d_gl_info *gl_info, const struc /* GL locking is done by the caller */ static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType, - const void *idxData, UINT idxSize, UINT startIdx, UINT base_vertex_index) + const void *idxData, UINT idxSize, UINT startIdx, UINT base_vertex_index, UINT instance_count) { - UINT numInstances = 0, i; int numInstancedAttribs = 0, j; UINT instancedData[sizeof(si->elements) / sizeof(*si->elements) /* 16 */]; GLenum idxtype = idxSize == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT; + UINT i; if (!idxSize) { @@ -513,22 +513,6 @@ static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const st return; } - /* First, figure out how many instances we have to draw */ - for (i = 0; i < MAX_STREAMS; ++i) - { - /* Look at the streams and take the first one which matches */ - if (state->streams[i].buffer - && ((state->streams[i].flags & WINED3DSTREAMSOURCE_INSTANCEDATA) - || (state->streams[i].flags & WINED3DSTREAMSOURCE_INDEXEDDATA))) - { - /* Use the specified number of instances from the first matched - * stream. A streamFreq of 0 (with INSTANCEDATA or INDEXEDDATA) - * is handled as 1. See d3d9/tests/visual.c-> stream_test(). */ - numInstances = state->streams[i].frequency ? state->streams[i].frequency : 1; - break; - } - } - for (i = 0; i < sizeof(si->elements) / sizeof(*si->elements); ++i) { if (!(si->use_map & (1 << i))) continue; @@ -540,8 +524,8 @@ static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const st } } - /* now draw numInstances instances :-) */ - for(i = 0; i < numInstances; i++) { + for (i = 0; i < instance_count; ++i) + { /* Specify the instanced attributes using immediate mode calls */ for(j = 0; j < numInstancedAttribs; j++) { const BYTE *ptr = si->elements[instancedData[j]].data.addr @@ -769,11 +753,11 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co glPrimType, idx_data, idx_size, start_idx); } } - else if (device->instancedDraw) + else if (device->instance_count) { /* Instancing emulation with mixing immediate mode and arrays */ - drawStridedInstanced(gl_info, state, stream_info, index_count, - glPrimType, idx_data, idx_size, start_idx, base_vertex_index); + drawStridedInstanced(gl_info, state, stream_info, index_count, glPrimType, + idx_data, idx_size, start_idx, base_vertex_index, device->instance_count); } else { diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index fae79645927..6f0c4f2f50c 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -4126,7 +4126,7 @@ static void load_numbered_arrays(struct wined3d_context *context, int i; /* Default to no instancing */ - device->instancedDraw = FALSE; + device->instance_count = 0; for (i = 0; i < MAX_ATTRIBS; i++) { @@ -4146,8 +4146,9 @@ static void load_numbered_arrays(struct wined3d_context *context, /* Do not load instance data. It will be specified using glTexCoord by drawprim */ if (stream->flags & WINED3DSTREAMSOURCE_INSTANCEDATA) { + if (!device->instance_count) + device->instance_count = state->streams[0].frequency ? state->streams[0].frequency : 1; if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i); - device->instancedDraw = TRUE; continue; } @@ -4290,7 +4291,7 @@ static void load_vertex_data(const struct wined3d_context *context, TRACE("Using fast vertex array code\n"); /* This is fixed function pipeline only, and the fixed function pipeline doesn't do instancing */ - device->instancedDraw = FALSE; + device->instance_count = 0; /* Blend Data ---------------------------------------------- */ if ((si->use_map & (1 << WINED3D_FFP_BLENDWEIGHT)) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 3610fc30b51..ddf1fa2e312 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1724,6 +1724,7 @@ struct wined3d_device UINT vs_version, gs_version, ps_version; DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */ DWORD vs_clipping; + UINT instance_count; WORD view_ident : 1; /* true iff view matrix is identity */ WORD vertexBlendUsed : 1; /* To avoid needless setting of the blend matrices */ @@ -1734,9 +1735,8 @@ struct wined3d_device WORD inScene : 1; /* A flag to check for proper BeginScene / EndScene call pairs */ WORD softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */ WORD useDrawStridedSlow : 1; - WORD instancedDraw : 1; WORD filter_messages : 1; - WORD padding : 5; + WORD padding : 6; BYTE fixed_function_usage_map; /* MAX_TEXTURES, 8 */