[PATCH 2/5] wined3d: Include the base vertex index in WINED3D_CS_OP_DRAW.
Henri Verbeet
hverbeet at codeweavers.com
Tue Jun 21 03:32:44 CDT 2016
Ideally we'd just remove the base vertex index from the wined3d_state
structure, but it's included in d3d8 stateblocks.
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/wined3d/cs.c | 18 ++++++++++--------
dlls/wined3d/device.c | 9 +++++----
dlls/wined3d/drawprim.c | 30 +++++++++++++++---------------
dlls/wined3d/wined3d_private.h | 8 ++++----
4 files changed, 34 insertions(+), 31 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index e02c257..2ab3ca5 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -78,10 +78,11 @@ struct wined3d_cs_clear
struct wined3d_cs_draw
{
enum wined3d_cs_op opcode;
- UINT start_idx;
- UINT index_count;
- UINT start_instance;
- UINT instance_count;
+ int base_vertex_idx;
+ unsigned int start_idx;
+ unsigned int index_count;
+ unsigned int start_instance;
+ unsigned int instance_count;
BOOL indexed;
};
@@ -312,17 +313,18 @@ static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data)
{
const struct wined3d_cs_draw *op = data;
- draw_primitive(cs->device, &cs->device->state, op->start_idx, op->index_count,
- op->start_instance, op->instance_count, op->indexed);
+ draw_primitive(cs->device, &cs->device->state, op->base_vertex_idx, op->start_idx,
+ op->index_count, op->start_instance, op->instance_count, op->indexed);
}
-void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_count,
- UINT start_instance, UINT instance_count, BOOL indexed)
+void wined3d_cs_emit_draw(struct wined3d_cs *cs, int base_vertex_idx, unsigned int start_idx,
+ unsigned int index_count, unsigned int start_instance, unsigned int instance_count, BOOL indexed)
{
struct wined3d_cs_draw *op;
op = cs->ops->require_space(cs, sizeof(*op));
op->opcode = WINED3D_CS_OP_DRAW;
+ op->base_vertex_idx = base_vertex_idx;
op->start_idx = start_idx;
op->index_count = index_count;
op->start_instance = start_instance;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 5ba128d..6678219 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3503,7 +3503,7 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT
device_invalidate_state(device, STATE_BASEVERTEXINDEX);
}
- wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, 0, 0, FALSE);
+ wined3d_cs_emit_draw(device->cs, 0, start_vertex, vertex_count, 0, 0, FALSE);
return WINED3D_OK;
}
@@ -3514,7 +3514,7 @@ void CDECL wined3d_device_draw_primitive_instanced(struct wined3d_device *device
TRACE("device %p, start_vertex %u, vertex_count %u, start_instance %u, instance_count %u.\n",
device, start_vertex, vertex_count, start_instance, instance_count);
- wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, start_instance, instance_count, FALSE);
+ wined3d_cs_emit_draw(device->cs, 0, start_vertex, vertex_count, start_instance, instance_count, FALSE);
}
HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count)
@@ -3540,7 +3540,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic
device_invalidate_state(device, STATE_BASEVERTEXINDEX);
}
- wined3d_cs_emit_draw(device->cs, start_idx, index_count, 0, 0, TRUE);
+ wined3d_cs_emit_draw(device->cs, device->state.base_vertex_index, start_idx, index_count, 0, 0, TRUE);
return WINED3D_OK;
}
@@ -3551,7 +3551,8 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device
TRACE("device %p, start_idx %u, index_count %u, start_instance %u, instance_count %u.\n",
device, start_idx, index_count, start_instance, instance_count);
- wined3d_cs_emit_draw(device->cs, start_idx, index_count, start_instance, instance_count, TRUE);
+ wined3d_cs_emit_draw(device->cs, device->state.base_vertex_index,
+ start_idx, index_count, start_instance, instance_count, TRUE);
}
static HRESULT wined3d_device_update_texture_3d(struct wined3d_device *device,
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 5a9e084..9f92851 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -38,8 +38,8 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d);
/* Context activation is done by the caller. */
static void draw_primitive_arrays(struct wined3d_context *context, const struct wined3d_state *state,
- unsigned int count, const void *idx_data, unsigned int idx_size, unsigned int start_idx,
- unsigned int start_instance, unsigned int instance_count)
+ const void *idx_data, unsigned int idx_size, int base_vertex_idx, unsigned int start_idx,
+ unsigned int count, unsigned int start_instance, unsigned int instance_count)
{
const struct wined3d_ffp_attrib_ops *ops = &context->d3d_info->ffp_attrib_ops;
GLenum idx_type = idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
@@ -61,7 +61,7 @@ static void draw_primitive_arrays(struct wined3d_context *context, const struct
if (gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX])
{
GL_EXTCALL(glDrawElementsBaseVertex(state->gl_primitive_type, count, idx_type,
- (const char *)idx_data + (idx_size * start_idx), state->base_vertex_index));
+ (const char *)idx_data + (idx_size * start_idx), base_vertex_idx));
checkGLcall("glDrawElementsBaseVertex");
return;
}
@@ -87,7 +87,7 @@ static void draw_primitive_arrays(struct wined3d_context *context, const struct
if (gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX])
{
GL_EXTCALL(glDrawElementsInstancedBaseVertex(state->gl_primitive_type, count, idx_type,
- (const char *)idx_data + (idx_size * start_idx), instance_count, state->base_vertex_index));
+ (const char *)idx_data + (idx_size * start_idx), instance_count, base_vertex_idx));
checkGLcall("glDrawElementsInstancedBaseVertex");
return;
}
@@ -142,7 +142,7 @@ static void draw_primitive_arrays(struct wined3d_context *context, const struct
if (gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX])
{
GL_EXTCALL(glDrawElementsBaseVertex(state->gl_primitive_type, count, idx_type,
- (const char *)idx_data + (idx_size * start_idx), state->base_vertex_index));
+ (const char *)idx_data + (idx_size * start_idx), base_vertex_idx));
checkGLcall("glDrawElementsBaseVertex");
}
else
@@ -166,8 +166,8 @@ static unsigned int get_stride_idx(const void *idx_data, unsigned int idx_size,
/* Context activation is done by the caller. */
static void draw_primitive_immediate_mode(struct wined3d_context *context, const struct wined3d_state *state,
- const struct wined3d_stream_info *si, unsigned int vertex_count, const void *idx_data,
- unsigned int idx_size, unsigned int start_idx, unsigned int instance_count)
+ const struct wined3d_stream_info *si, const void *idx_data, unsigned int idx_size,
+ int base_vertex_idx, unsigned int start_idx, unsigned int vertex_count, unsigned int instance_count)
{
const BYTE *position = NULL, *normal = NULL, *diffuse = NULL, *specular = NULL;
const struct wined3d_d3d_info *d3d_info = context->d3d_info;
@@ -214,7 +214,7 @@ static void draw_primitive_immediate_mode(struct wined3d_context *context, const
unsigned int use_map = si->use_map;
unsigned int element_idx;
- stride_idx = get_stride_idx(idx_data, idx_size, state->base_vertex_index, start_idx, vertex_idx);
+ stride_idx = get_stride_idx(idx_data, idx_size, base_vertex_idx, start_idx, vertex_idx);
for (element_idx = MAX_ATTRIBS - 1; use_map; use_map &= ~(1u << element_idx), --element_idx)
{
if (!(use_map & 1u << element_idx))
@@ -328,7 +328,7 @@ static void draw_primitive_immediate_mode(struct wined3d_context *context, const
{
unsigned int tmp_tex_mask;
- stride_idx = get_stride_idx(idx_data, idx_size, state->base_vertex_index, start_idx, vertex_idx);
+ stride_idx = get_stride_idx(idx_data, idx_size, base_vertex_idx, start_idx, vertex_idx);
if (normal)
{
@@ -409,8 +409,8 @@ static void remove_vbos(struct wined3d_context *context,
/* Routine common to the draw primitive and draw indexed primitive routines */
void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state,
- unsigned int start_idx, unsigned int index_count, unsigned int start_instance,
- unsigned int instance_count, BOOL indexed)
+ int base_vertex_idx, unsigned int start_idx, unsigned int index_count,
+ unsigned int start_instance, unsigned int instance_count, BOOL indexed)
{
const struct wined3d_fb_state *fb = state->fb;
const struct wined3d_stream_info *stream_info;
@@ -574,11 +574,11 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s
}
if (context->use_immediate_mode_draw || emulation)
- draw_primitive_immediate_mode(context, state, stream_info, index_count,
- idx_data, idx_size, start_idx, instance_count);
+ draw_primitive_immediate_mode(context, state, stream_info, idx_data,
+ idx_size, base_vertex_idx, start_idx, index_count, instance_count);
else
- draw_primitive_arrays(context, state, index_count, idx_data,
- idx_size, start_idx, start_instance, instance_count);
+ draw_primitive_arrays(context, state, idx_data, idx_size, base_vertex_idx,
+ start_idx, index_count, start_instance, instance_count);
if (ib_query)
wined3d_event_query_issue(ib_query, device);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f6f6bb3..76425e0 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1225,8 +1225,8 @@ struct wined3d_stream_info
};
void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state,
- unsigned int start_idx, unsigned int index_count, unsigned int start_instance,
- unsigned int instance_count, BOOL indexed) DECLSPEC_HIDDEN;
+ int base_vertex_idx, unsigned int start_idx, unsigned int index_count,
+ unsigned int start_instance, unsigned int instance_count, BOOL indexed) DECLSPEC_HIDDEN;
DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN;
#define eps 1e-8f
@@ -2916,8 +2916,8 @@ void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects,
DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN;
-void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_count,
- UINT start_instance, UINT instance_count, BOOL indexed) DECLSPEC_HIDDEN;
+void wined3d_cs_emit_draw(struct wined3d_cs *cs, int base_vertex_idx, unsigned int start_idx, unsigned int index_count,
+ unsigned int start_instance, unsigned int instance_count, BOOL indexed) DECLSPEC_HIDDEN;
void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain,
const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, DWORD flags) DECLSPEC_HIDDEN;
void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
--
2.1.4
More information about the wine-patches
mailing list