wined3d: Store the wined3d primitive type in the wined3d state structure.

As opposed to the OpenGL primitive type.

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Henri Verbeet 2020-05-20 18:12:28 +04:30 committed by Alexandre Julliard
parent acd209d603
commit 51a901e34e
8 changed files with 93 additions and 137 deletions

View File

@ -38,6 +38,52 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_synchronous);
static DWORD wined3d_context_tls_idx;
/* Note that except for WINED3DPT_POINTLIST and WINED3DPT_LINELIST these
* actually have the same values in GL and D3D. */
static GLenum gl_primitive_type_from_d3d(enum wined3d_primitive_type primitive_type)
{
switch (primitive_type)
{
case WINED3D_PT_POINTLIST:
return GL_POINTS;
case WINED3D_PT_LINELIST:
return GL_LINES;
case WINED3D_PT_LINESTRIP:
return GL_LINE_STRIP;
case WINED3D_PT_TRIANGLELIST:
return GL_TRIANGLES;
case WINED3D_PT_TRIANGLESTRIP:
return GL_TRIANGLE_STRIP;
case WINED3D_PT_TRIANGLEFAN:
return GL_TRIANGLE_FAN;
case WINED3D_PT_LINELIST_ADJ:
return GL_LINES_ADJACENCY_ARB;
case WINED3D_PT_LINESTRIP_ADJ:
return GL_LINE_STRIP_ADJACENCY_ARB;
case WINED3D_PT_TRIANGLELIST_ADJ:
return GL_TRIANGLES_ADJACENCY_ARB;
case WINED3D_PT_TRIANGLESTRIP_ADJ:
return GL_TRIANGLE_STRIP_ADJACENCY_ARB;
case WINED3D_PT_PATCH:
return GL_PATCHES;
default:
FIXME("Unhandled primitive type %s.\n", debug_d3dprimitivetype(primitive_type));
case WINED3D_PT_UNDEFINED:
return ~0u;
}
}
/* FBO helper functions */
/* Context activation is done by the caller. */
@ -3931,10 +3977,10 @@ static void wined3d_context_gl_draw_primitive_arrays(struct wined3d_context_gl *
const struct wined3d_ffp_attrib_ops *ops = &context_gl->c.d3d_info->ffp_attrib_ops;
GLenum idx_type = idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
const struct wined3d_stream_info *si = &context_gl->c.stream_info;
GLenum mode = gl_primitive_type_from_d3d(state->primitive_type);
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
unsigned int instanced_elements[ARRAY_SIZE(si->elements)];
unsigned int instanced_element_count = 0;
GLenum mode = state->gl_primitive_type;
const void *indices;
unsigned int i, j;
@ -4104,7 +4150,7 @@ static void draw_primitive_immediate_mode(struct wined3d_context_gl *context_gl,
ops = &d3d_info->ffp_attrib_ops;
gl_info->gl_ops.gl.p_glBegin(state->gl_primitive_type);
gl_info->gl_ops.gl.p_glBegin(gl_primitive_type_from_d3d(state->primitive_type));
if (use_vs(state) || d3d_info->ffp_generic_attributes)
{
@ -4289,6 +4335,7 @@ static void draw_primitive_immediate_mode(struct wined3d_context_gl *context_gl,
static void wined3d_context_gl_draw_indirect(struct wined3d_context_gl *context_gl, const struct wined3d_state *state,
const struct wined3d_indirect_draw_parameters *parameters, unsigned int idx_size)
{
GLenum gl_primitive_type = gl_primitive_type_from_d3d(state->primitive_type);
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
struct wined3d_buffer *buffer = parameters->buffer;
const void *offset;
@ -4307,11 +4354,11 @@ static void wined3d_context_gl_draw_indirect(struct wined3d_context_gl *context_
GLenum idx_type = idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
if (state->index_offset)
FIXME("Ignoring index offset %u.\n", state->index_offset);
GL_EXTCALL(glDrawElementsIndirect(state->gl_primitive_type, idx_type, offset));
GL_EXTCALL(glDrawElementsIndirect(gl_primitive_type, idx_type, offset));
}
else
{
GL_EXTCALL(glDrawArraysIndirect(state->gl_primitive_type, offset));
GL_EXTCALL(glDrawArraysIndirect(gl_primitive_type, offset));
}
GL_EXTCALL(glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0));
@ -4545,7 +4592,7 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s
else if (!context->transform_feedback_active)
{
enum wined3d_primitive_type primitive_type = shader->u.gs.output_type
? shader->u.gs.output_type : d3d_primitive_type_from_gl(state->gl_primitive_type);
? shader->u.gs.output_type : state->primitive_type;
GLenum mode = gl_tfb_primitive_type_from_d3d(primitive_type);
GL_EXTCALL(glBeginTransformFeedback(mode));
checkGLcall("glBeginTransformFeedback");
@ -4553,7 +4600,7 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s
}
}
if (state->gl_primitive_type == GL_PATCHES)
if (state->primitive_type == WINED3D_PT_PATCH)
{
GL_EXTCALL(glPatchParameteri(GL_PATCH_VERTICES, state->gl_patch_vertices));
checkGLcall("glPatchParameteri");

View File

@ -121,7 +121,7 @@ struct wined3d_cs_dispatch
struct wined3d_cs_draw
{
enum wined3d_cs_op opcode;
GLenum primitive_type;
enum wined3d_primitive_type primitive_type;
GLint patch_vertex_count;
struct wined3d_draw_parameters parameters;
};
@ -881,13 +881,13 @@ static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data)
device_invalidate_state(cs->device, STATE_BASEVERTEXINDEX);
}
if (state->gl_primitive_type != op->primitive_type)
if (state->primitive_type != op->primitive_type)
{
if ((geometry_shader = state->shader[WINED3D_SHADER_TYPE_GEOMETRY]) && !geometry_shader->function)
device_invalidate_state(cs->device, STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY));
if (state->gl_primitive_type == GL_POINTS || op->primitive_type == GL_POINTS)
if (state->primitive_type == WINED3D_PT_POINTLIST || op->primitive_type == WINED3D_PT_POINTLIST)
device_invalidate_state(cs->device, STATE_POINT_ENABLE);
state->gl_primitive_type = op->primitive_type;
state->primitive_type = op->primitive_type;
}
state->gl_patch_vertices = op->patch_vertex_count;
@ -962,9 +962,9 @@ static void acquire_graphics_pipeline_resources(const struct wined3d_state *stat
state->unordered_access_view[WINED3D_PIPELINE_GRAPHICS]);
}
void wined3d_cs_emit_draw(struct wined3d_cs *cs, GLenum primitive_type, unsigned int patch_vertex_count,
int base_vertex_idx, unsigned int start_idx, unsigned int index_count,
unsigned int start_instance, unsigned int instance_count, BOOL indexed)
void wined3d_cs_emit_draw(struct wined3d_cs *cs, enum wined3d_primitive_type primitive_type,
unsigned int patch_vertex_count, 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_d3d_info *d3d_info = &cs->device->adapter->d3d_info;
const struct wined3d_state *state = &cs->device->state;
@ -987,8 +987,8 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, GLenum primitive_type, unsigned
wined3d_cs_submit(cs, WINED3D_CS_QUEUE_DEFAULT);
}
void wined3d_cs_emit_draw_indirect(struct wined3d_cs *cs, GLenum primitive_type, unsigned int patch_vertex_count,
struct wined3d_buffer *buffer, unsigned int offset, BOOL indexed)
void wined3d_cs_emit_draw_indirect(struct wined3d_cs *cs, enum wined3d_primitive_type primitive_type,
unsigned int patch_vertex_count, struct wined3d_buffer *buffer, unsigned int offset, bool indexed)
{
const struct wined3d_d3d_info *d3d_info = &cs->device->adapter->d3d_info;
const struct wined3d_state *state = &cs->device->state;

View File

@ -90,96 +90,6 @@ const struct wined3d_light WINED3D_default_light =
0.0f /* Phi */
};
/* Note that except for WINED3DPT_POINTLIST and WINED3DPT_LINELIST these
* actually have the same values in GL and D3D. */
GLenum gl_primitive_type_from_d3d(enum wined3d_primitive_type primitive_type)
{
switch (primitive_type)
{
case WINED3D_PT_POINTLIST:
return GL_POINTS;
case WINED3D_PT_LINELIST:
return GL_LINES;
case WINED3D_PT_LINESTRIP:
return GL_LINE_STRIP;
case WINED3D_PT_TRIANGLELIST:
return GL_TRIANGLES;
case WINED3D_PT_TRIANGLESTRIP:
return GL_TRIANGLE_STRIP;
case WINED3D_PT_TRIANGLEFAN:
return GL_TRIANGLE_FAN;
case WINED3D_PT_LINELIST_ADJ:
return GL_LINES_ADJACENCY_ARB;
case WINED3D_PT_LINESTRIP_ADJ:
return GL_LINE_STRIP_ADJACENCY_ARB;
case WINED3D_PT_TRIANGLELIST_ADJ:
return GL_TRIANGLES_ADJACENCY_ARB;
case WINED3D_PT_TRIANGLESTRIP_ADJ:
return GL_TRIANGLE_STRIP_ADJACENCY_ARB;
case WINED3D_PT_PATCH:
return GL_PATCHES;
default:
FIXME("Unhandled primitive type %s.\n", debug_d3dprimitivetype(primitive_type));
case WINED3D_PT_UNDEFINED:
return ~0u;
}
}
enum wined3d_primitive_type d3d_primitive_type_from_gl(GLenum primitive_type)
{
switch (primitive_type)
{
case GL_POINTS:
return WINED3D_PT_POINTLIST;
case GL_LINES:
return WINED3D_PT_LINELIST;
case GL_LINE_STRIP:
return WINED3D_PT_LINESTRIP;
case GL_TRIANGLES:
return WINED3D_PT_TRIANGLELIST;
case GL_TRIANGLE_STRIP:
return WINED3D_PT_TRIANGLESTRIP;
case GL_TRIANGLE_FAN:
return WINED3D_PT_TRIANGLEFAN;
case GL_LINES_ADJACENCY_ARB:
return WINED3D_PT_LINELIST_ADJ;
case GL_LINE_STRIP_ADJACENCY_ARB:
return WINED3D_PT_LINESTRIP_ADJ;
case GL_TRIANGLES_ADJACENCY_ARB:
return WINED3D_PT_TRIANGLELIST_ADJ;
case GL_TRIANGLE_STRIP_ADJACENCY_ARB:
return WINED3D_PT_TRIANGLESTRIP_ADJ;
case GL_PATCHES:
return WINED3D_PT_PATCH;
default:
FIXME("Unhandled primitive type %s.\n", debug_d3dprimitivetype(primitive_type));
case ~0u:
return WINED3D_PT_UNDEFINED;
}
}
BOOL device_context_add(struct wined3d_device *device, struct wined3d_context *context)
{
struct wined3d_context **new_array;
@ -4066,7 +3976,7 @@ void CDECL wined3d_device_set_primitive_type(struct wined3d_device *device,
TRACE("device %p, primitive_type %s, patch_vertex_count %u.\n",
device, debug_d3dprimitivetype(primitive_type), patch_vertex_count);
device->state.gl_primitive_type = gl_primitive_type_from_d3d(primitive_type);
device->state.primitive_type = primitive_type;
device->state.gl_patch_vertices = patch_vertex_count;
}
@ -4076,7 +3986,7 @@ void CDECL wined3d_device_get_primitive_type(const struct wined3d_device *device
TRACE("device %p, primitive_type %p, patch_vertex_count %p.\n",
device, primitive_type, patch_vertex_count);
*primitive_type = d3d_primitive_type_from_gl(device->state.gl_primitive_type);
*primitive_type = device->state.primitive_type;
if (patch_vertex_count)
*patch_vertex_count = device->state.gl_patch_vertices;
@ -4087,8 +3997,8 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT
{
TRACE("device %p, start_vertex %u, vertex_count %u.\n", device, start_vertex, vertex_count);
wined3d_cs_emit_draw(device->cs, device->state.gl_primitive_type, device->state.gl_patch_vertices,
0, start_vertex, vertex_count, 0, 0, FALSE);
wined3d_cs_emit_draw(device->cs, device->state.primitive_type,
device->state.gl_patch_vertices, 0, start_vertex, vertex_count, 0, 0, false);
return WINED3D_OK;
}
@ -4099,8 +4009,8 @@ 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, device->state.gl_primitive_type, device->state.gl_patch_vertices,
0, start_vertex, vertex_count, start_instance, instance_count, FALSE);
wined3d_cs_emit_draw(device->cs, device->state.primitive_type, device->state.gl_patch_vertices,
0, start_vertex, vertex_count, start_instance, instance_count, false);
}
void CDECL wined3d_device_draw_primitive_instanced_indirect(struct wined3d_device *device,
@ -4108,8 +4018,8 @@ void CDECL wined3d_device_draw_primitive_instanced_indirect(struct wined3d_devic
{
TRACE("device %p, buffer %p, offset %u.\n", device, buffer, offset);
wined3d_cs_emit_draw_indirect(device->cs, device->state.gl_primitive_type, device->state.gl_patch_vertices,
buffer, offset, FALSE);
wined3d_cs_emit_draw_indirect(device->cs, device->state.primitive_type,
device->state.gl_patch_vertices, buffer, offset, false);
}
HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count)
@ -4126,8 +4036,8 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic
return WINED3DERR_INVALIDCALL;
}
wined3d_cs_emit_draw(device->cs, device->state.gl_primitive_type, device->state.gl_patch_vertices,
device->state.base_vertex_index, start_idx, index_count, 0, 0, TRUE);
wined3d_cs_emit_draw(device->cs, device->state.primitive_type, device->state.gl_patch_vertices,
device->state.base_vertex_index, start_idx, index_count, 0, 0, true);
return WINED3D_OK;
}
@ -4138,8 +4048,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, device->state.gl_primitive_type, device->state.gl_patch_vertices,
device->state.base_vertex_index, start_idx, index_count, start_instance, instance_count, TRUE);
wined3d_cs_emit_draw(device->cs, device->state.primitive_type, device->state.gl_patch_vertices,
device->state.base_vertex_index, start_idx, index_count, start_instance, instance_count, true);
}
void CDECL wined3d_device_draw_indexed_primitive_instanced_indirect(struct wined3d_device *device,
@ -4147,8 +4057,8 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced_indirect(struct wined
{
TRACE("device %p, buffer %p, offset %u.\n", device, buffer, offset);
wined3d_cs_emit_draw_indirect(device->cs, device->state.gl_primitive_type, device->state.gl_patch_vertices,
buffer, offset, TRUE);
wined3d_cs_emit_draw_indirect(device->cs, device->state.primitive_type,
device->state.gl_patch_vertices, buffer, offset, true);
}
HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,

View File

@ -10348,7 +10348,7 @@ static void set_glsl_shader_program(const struct wined3d_context_gl *context_gl,
if (vshader->reg_maps.shader_version.major < 4)
{
reorder_shader_id = shader_glsl_generate_vs3_rasterizer_input_setup(priv, vshader, pshader,
state->gl_primitive_type == GL_POINTS && vshader->reg_maps.point_size,
state->primitive_type == WINED3D_PT_POINTLIST && vshader->reg_maps.point_size,
d3d_info->emulated_flatshading
&& state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT, gl_info);
TRACE("Attaching GLSL shader object %u to program %u.\n", reorder_shader_id, program_id);
@ -11809,7 +11809,8 @@ static void glsl_vertex_pointsprite_core(struct wined3d_context *context,
{
static unsigned int once;
if (state->gl_primitive_type == GL_POINTS && !state->render_states[WINED3D_RS_POINTSPRITEENABLE] && !once++)
if (state->primitive_type == WINED3D_PT_POINTLIST
&& !state->render_states[WINED3D_RS_POINTSPRITEENABLE] && !once++)
FIXME("Non-point sprite points not supported in core profile.\n");
}

View File

@ -3541,7 +3541,7 @@ void find_vs_compile_args(const struct wined3d_state *state, const struct wined3
== WINED3D_FOG_NONE ? VS_FOG_COORD : VS_FOG_Z;
args->clip_enabled = state->render_states[WINED3D_RS_CLIPPING]
&& state->render_states[WINED3D_RS_CLIPPLANEENABLE];
args->point_size = state->gl_primitive_type == GL_POINTS;
args->point_size = state->primitive_type == WINED3D_PT_POINTLIST;
args->per_vertex_point_size = shader->reg_maps.point_size;
args->next_shader_type = hull_shader ? WINED3D_SHADER_TYPE_HULL
: geometry_shader ? WINED3D_SHADER_TYPE_GEOMETRY : WINED3D_SHADER_TYPE_PIXEL;
@ -3899,7 +3899,7 @@ void find_gs_compile_args(const struct wined3d_state *state, const struct wined3
args->output_count = pixel_shader ? pixel_shader->limits->packed_input : shader->limits->packed_output;
if (!(args->primitive_type = shader->u.gs.input_type))
args->primitive_type = d3d_primitive_type_from_gl(state->gl_primitive_type);
args->primitive_type = state->primitive_type;
init_interpolation_compile_args(args->interpolation_mode, pixel_shader, context->d3d_info);
}
@ -4155,7 +4155,7 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
}
args->pointsprite = state->render_states[WINED3D_RS_POINTSPRITEENABLE]
&& state->gl_primitive_type == GL_POINTS;
&& state->primitive_type == WINED3D_PT_POINTLIST;
if (d3d_info->ffp_alpha_test)
args->alpha_test_func = WINED3D_CMP_ALWAYS - 1;

View File

@ -1818,7 +1818,7 @@ static void state_init_default(struct wined3d_state *state, const struct wined3d
TRACE("state %p, d3d_info %p.\n", state, d3d_info);
get_identity_matrix(&identity);
state->gl_primitive_type = ~0u;
state->primitive_type = WINED3D_PT_UNDEFINED;
state->gl_patch_vertices = 0;
/* Set some of the defaults for lights, transforms etc */

View File

@ -6334,7 +6334,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d
}
settings->pointsprite = state->render_states[WINED3D_RS_POINTSPRITEENABLE]
&& state->gl_primitive_type == GL_POINTS;
&& state->primitive_type == WINED3D_PT_POINTLIST;
if (d3d_info->ffp_alpha_test)
settings->alpha_test_func = WINED3D_CMP_ALWAYS - 1;
@ -6498,7 +6498,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
if (si->position_transformed)
{
settings->transformed = 1;
settings->point_size = state->gl_primitive_type == GL_POINTS;
settings->point_size = state->primitive_type == WINED3D_PT_POINTLIST;
settings->per_vertex_point_size = !!(si->use_map & 1u << WINED3D_FFP_PSIZE);
if (!state->render_states[WINED3D_RS_FOGENABLE])
settings->fog_mode = WINED3D_FFP_VS_FOG_OFF;
@ -6546,7 +6546,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
settings->normalize = settings->normal && state->render_states[WINED3D_RS_NORMALIZENORMALS];
settings->lighting = !!state->render_states[WINED3D_RS_LIGHTING];
settings->localviewer = !!state->render_states[WINED3D_RS_LOCALVIEWER];
settings->point_size = state->gl_primitive_type == GL_POINTS;
settings->point_size = state->primitive_type == WINED3D_PT_POINTLIST;
settings->per_vertex_point_size = !!(si->use_map & 1u << WINED3D_FFP_PSIZE);
wined3d_get_material_colour_source(&diffuse_source, &emissive_source,

View File

@ -3488,7 +3488,7 @@ struct wined3d_state
unsigned int index_offset;
int base_vertex_index;
int load_base_vertex_index; /* Non-indexed drawing needs 0 here, indexed needs base_vertex_index. */
GLenum gl_primitive_type;
enum wined3d_primitive_type primitive_type;
GLint gl_patch_vertices;
struct wined3d_query *predicate;
BOOL predicate_value;
@ -4490,11 +4490,12 @@ void wined3d_cs_emit_dispatch(struct wined3d_cs *cs,
unsigned int group_count_x, unsigned int group_count_y, unsigned int group_count_z) DECLSPEC_HIDDEN;
void wined3d_cs_emit_dispatch_indirect(struct wined3d_cs *cs,
struct wined3d_buffer *buffer, unsigned int offset) DECLSPEC_HIDDEN;
void wined3d_cs_emit_draw(struct wined3d_cs *cs, GLenum primitive_type, unsigned int patch_vertex_count,
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_draw_indirect(struct wined3d_cs *cs, GLenum primitive_type, unsigned int patch_vertex_count,
struct wined3d_buffer *buffer, unsigned int offset, BOOL indexed) DECLSPEC_HIDDEN;
void wined3d_cs_emit_draw(struct wined3d_cs *cs, enum wined3d_primitive_type primitive_type,
unsigned int patch_vertex_count, 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_draw_indirect(struct wined3d_cs *cs, enum wined3d_primitive_type primitive_type,
unsigned int patch_vertex_count, struct wined3d_buffer *buffer,
unsigned int offset, bool indexed) DECLSPEC_HIDDEN;
void wined3d_cs_emit_flush(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
void wined3d_cs_emit_generate_mipmaps(struct wined3d_cs *cs, struct wined3d_shader_resource_view *view) DECLSPEC_HIDDEN;
void wined3d_cs_emit_preload_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
@ -5066,9 +5067,6 @@ void state_pointsprite(struct wined3d_context *context,
void state_shademode(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
GLenum gl_primitive_type_from_d3d(enum wined3d_primitive_type primitive_type) DECLSPEC_HIDDEN;
enum wined3d_primitive_type d3d_primitive_type_from_gl(GLenum primitive_type) DECLSPEC_HIDDEN;
/* Math utils */
void multiply_matrix(struct wined3d_matrix *dest, const struct wined3d_matrix *src1,
const struct wined3d_matrix *src2) DECLSPEC_HIDDEN;