[PATCH 4/5] wined3d: Resolve the instance count for instanced arrays in load_numbered_arrays().
Henri Verbeet
hverbeet at codeweavers.com
Sun Dec 2 11:53:19 CST 2012
---
dlls/wined3d/drawprim.c | 30 +++++++-----------------------
dlls/wined3d/state.c | 7 ++++---
dlls/wined3d/wined3d_private.h | 4 ++--
3 files changed, 13 insertions(+), 28 deletions(-)
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 02d0144..9443877 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 9b5d875..e0811a9 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -4121,7 +4121,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++)
{
@@ -4141,8 +4141,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;
}
@@ -4285,7 +4286,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 3610fc3..ddf1fa2 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 */
--
1.7.8.6
More information about the wine-patches
mailing list