Commit 1b08196c authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Implement d3d10 style instance data step rates.

parent e7116725
...@@ -72,15 +72,12 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME ...@@ -72,15 +72,12 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME
e->input_slot = f->InputSlot; e->input_slot = f->InputSlot;
e->offset = f->AlignedByteOffset; e->offset = f->AlignedByteOffset;
e->output_slot = WINED3D_OUTPUT_SLOT_UNUSED; e->output_slot = WINED3D_OUTPUT_SLOT_UNUSED;
e->input_slot_class = f->InputSlotClass;
e->instance_data_step_rate = f->InstanceDataStepRate;
e->method = WINED3D_DECL_METHOD_DEFAULT; e->method = WINED3D_DECL_METHOD_DEFAULT;
e->usage = 0; e->usage = 0;
e->usage_idx = 0; e->usage_idx = 0;
if (f->InputSlotClass != D3D10_INPUT_PER_VERTEX_DATA)
FIXME("Ignoring input slot class (%#x)\n", f->InputSlotClass);
if (f->InstanceDataStepRate)
FIXME("Ignoring instance data step rate (%#x)\n", f->InstanceDataStepRate);
for (j = 0; j < is.element_count; ++j) for (j = 0; j < is.element_count; ++j)
{ {
if (!strcmp(element_descs[i].SemanticName, is.elements[j].semantic_name) if (!strcmp(element_descs[i].SemanticName, is.elements[j].semantic_name)
......
...@@ -286,6 +286,8 @@ static UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3 ...@@ -286,6 +286,8 @@ static UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3
element->input_slot = stream; element->input_slot = stream;
element->offset = offset; element->offset = offset;
element->output_slot = reg; element->output_slot = reg;
element->input_slot_class = WINED3D_INPUT_PER_VERTEX_DATA;
element->instance_data_step_rate = 0;
element->method = WINED3D_DECL_METHOD_DEFAULT; element->method = WINED3D_DECL_METHOD_DEFAULT;
element->usage = wined3d_usage_lookup[reg].usage; element->usage = wined3d_usage_lookup[reg].usage;
element->usage_idx = wined3d_usage_lookup[reg].usage_idx; element->usage_idx = wined3d_usage_lookup[reg].usage_idx;
......
...@@ -354,6 +354,8 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9 *d3d9_elem ...@@ -354,6 +354,8 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9 *d3d9_elem
(*wined3d_elements)[i].input_slot = d3d9_elements[i].Stream; (*wined3d_elements)[i].input_slot = d3d9_elements[i].Stream;
(*wined3d_elements)[i].offset = d3d9_elements[i].Offset; (*wined3d_elements)[i].offset = d3d9_elements[i].Offset;
(*wined3d_elements)[i].output_slot = WINED3D_OUTPUT_SLOT_SEMANTIC; (*wined3d_elements)[i].output_slot = WINED3D_OUTPUT_SLOT_SEMANTIC;
(*wined3d_elements)[i].input_slot_class = WINED3D_INPUT_PER_VERTEX_DATA;
(*wined3d_elements)[i].instance_data_step_rate = 0;
(*wined3d_elements)[i].method = d3d9_elements[i].Method; (*wined3d_elements)[i].method = d3d9_elements[i].Method;
(*wined3d_elements)[i].usage = d3d9_elements[i].Usage; (*wined3d_elements)[i].usage = d3d9_elements[i].Usage;
(*wined3d_elements)[i].usage_idx = d3d9_elements[i].UsageIndex; (*wined3d_elements)[i].usage_idx = d3d9_elements[i].UsageIndex;
......
...@@ -2806,16 +2806,31 @@ void context_stream_info_from_declaration(struct wined3d_context *context, ...@@ -2806,16 +2806,31 @@ void context_stream_info_from_declaration(struct wined3d_context *context,
if (stride_used) if (stride_used)
{ {
TRACE("Load %s array %u [usage %s, usage_idx %u, " TRACE("Load %s array %u [usage %s, usage_idx %u, "
"input_slot %u, offset %u, stride %u, format %s].\n", "input_slot %u, offset %u, stride %u, format %s, class %s, step_rate %u].\n",
use_vshader ? "shader": "fixed function", idx, use_vshader ? "shader": "fixed function", idx,
debug_d3ddeclusage(element->usage), element->usage_idx, element->input_slot, debug_d3ddeclusage(element->usage), element->usage_idx, element->input_slot,
element->offset, stream->stride, debug_d3dformat(element->format->id)); element->offset, stream->stride, debug_d3dformat(element->format->id),
debug_d3dinput_classification(element->input_slot_class), element->instance_data_step_rate);
stream_info->elements[idx].format = element->format; stream_info->elements[idx].format = element->format;
stream_info->elements[idx].data.buffer_object = 0; stream_info->elements[idx].data.buffer_object = 0;
stream_info->elements[idx].data.addr = (BYTE *)NULL + stream->offset + element->offset; stream_info->elements[idx].data.addr = (BYTE *)NULL + stream->offset + element->offset;
stream_info->elements[idx].stride = stream->stride; stream_info->elements[idx].stride = stream->stride;
stream_info->elements[idx].stream_idx = element->input_slot; stream_info->elements[idx].stream_idx = element->input_slot;
if (stream->flags & WINED3DSTREAMSOURCE_INSTANCEDATA)
{
stream_info->elements[idx].divisor = 1;
}
else if (element->input_slot_class == WINED3D_INPUT_PER_INSTANCE_DATA)
{
stream_info->elements[idx].divisor = element->instance_data_step_rate;
if (!element->instance_data_step_rate)
FIXME("Instance step rate 0 not implemented.\n");
}
else
{
stream_info->elements[idx].divisor = 0;
}
if (!context->gl_info->supported[ARB_VERTEX_ARRAY_BGRA] if (!context->gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
&& element->format->id == WINED3DFMT_B8G8R8A8_UNORM) && element->format->id == WINED3DFMT_B8G8R8A8_UNORM)
......
...@@ -4105,25 +4105,20 @@ static void load_numbered_arrays(struct wined3d_context *context, ...@@ -4105,25 +4105,20 @@ static void load_numbered_arrays(struct wined3d_context *context,
stream = &state->streams[stream_info->elements[i].stream_idx]; stream = &state->streams[stream_info->elements[i].stream_idx];
if (stream->flags & WINED3DSTREAMSOURCE_INSTANCEDATA) if ((stream->flags & WINED3DSTREAMSOURCE_INSTANCEDATA) && !context->instance_count)
{ context->instance_count = state->streams[0].frequency ? state->streams[0].frequency : 1;
if (!context->instance_count)
context->instance_count = state->streams[0].frequency ? state->streams[0].frequency : 1;
if (!gl_info->supported[ARB_INSTANCED_ARRAYS])
{
/* Unload instanced arrays, they will be loaded using
* immediate mode instead. */
if (context->numbered_array_mask & (1 << i))
unload_numbered_array(context, i);
continue;
}
GL_EXTCALL(glVertexAttribDivisor(i, 1)); if (gl_info->supported[ARB_INSTANCED_ARRAYS])
{
GL_EXTCALL(glVertexAttribDivisor(i, stream_info->elements[i].divisor));
} }
else if (gl_info->supported[ARB_INSTANCED_ARRAYS]) else if (stream_info->elements[i].divisor)
{ {
GL_EXTCALL(glVertexAttribDivisor(i, 0)); /* Unload instanced arrays, they will be loaded using
* immediate mode instead. */
if (context->numbered_array_mask & (1 << i))
unload_numbered_array(context, i);
continue;
} }
TRACE_(d3d_shader)("Loading array %u [VBO=%u]\n", i, stream_info->elements[i].data.buffer_object); TRACE_(d3d_shader)("Loading array %u [VBO=%u]\n", i, stream_info->elements[i].data.buffer_object);
......
...@@ -2603,6 +2603,20 @@ const char *debug_d3ddeclusage(enum wined3d_decl_usage usage) ...@@ -2603,6 +2603,20 @@ const char *debug_d3ddeclusage(enum wined3d_decl_usage usage)
} }
} }
const char *debug_d3dinput_classification(enum wined3d_input_classification classification)
{
switch (classification)
{
#define WINED3D_TO_STR(x) case x: return #x
WINED3D_TO_STR(WINED3D_INPUT_PER_VERTEX_DATA);
WINED3D_TO_STR(WINED3D_INPUT_PER_INSTANCE_DATA);
#undef WINED3D_TO_STR
default:
FIXME("Unrecognized input classification %#x.\n", classification);
return "unrecognized";
}
}
const char *debug_d3dresourcetype(enum wined3d_resource_type resource_type) const char *debug_d3dresourcetype(enum wined3d_resource_type resource_type)
{ {
switch (resource_type) switch (resource_type)
......
...@@ -30,13 +30,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_decl); ...@@ -30,13 +30,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_decl);
static void dump_wined3d_vertex_element(const struct wined3d_vertex_element *element) static void dump_wined3d_vertex_element(const struct wined3d_vertex_element *element)
{ {
TRACE(" format: %s (%#x)\n", debug_d3dformat(element->format), element->format); TRACE(" format: %s (%#x)\n", debug_d3dformat(element->format), element->format);
TRACE(" input_slot: %u\n", element->input_slot); TRACE(" input_slot: %u\n", element->input_slot);
TRACE(" offset: %u\n", element->offset); TRACE(" offset: %u\n", element->offset);
TRACE("output_slot: %u\n", element->output_slot); TRACE(" output_slot: %u\n", element->output_slot);
TRACE(" method: %s (%#x)\n", debug_d3ddeclmethod(element->method), element->method); TRACE(" input slot class: %s\n", debug_d3dinput_classification(element->input_slot_class));
TRACE(" usage: %s (%#x)\n", debug_d3ddeclusage(element->usage), element->usage); TRACE("instance data step rate: %u\n", element->instance_data_step_rate);
TRACE(" usage_idx: %u\n", element->usage_idx); TRACE(" method: %s (%#x)\n", debug_d3ddeclmethod(element->method), element->method);
TRACE(" usage: %s (%#x)\n", debug_d3ddeclusage(element->usage), element->usage);
TRACE(" usage_idx: %u\n", element->usage_idx);
} }
ULONG CDECL wined3d_vertex_declaration_incref(struct wined3d_vertex_declaration *declaration) ULONG CDECL wined3d_vertex_declaration_incref(struct wined3d_vertex_declaration *declaration)
...@@ -197,6 +199,8 @@ static HRESULT vertexdeclaration_init(struct wined3d_vertex_declaration *declara ...@@ -197,6 +199,8 @@ static HRESULT vertexdeclaration_init(struct wined3d_vertex_declaration *declara
e->input_slot = elements[i].input_slot; e->input_slot = elements[i].input_slot;
e->offset = elements[i].offset; e->offset = elements[i].offset;
e->output_slot = elements[i].output_slot; e->output_slot = elements[i].output_slot;
e->input_slot_class = elements[i].input_slot_class;
e->instance_data_step_rate = elements[i].instance_data_step_rate;
e->method = elements[i].method; e->method = elements[i].method;
e->usage = elements[i].usage; e->usage = elements[i].usage;
e->usage_idx = elements[i].usage_idx; e->usage_idx = elements[i].usage_idx;
...@@ -297,6 +301,8 @@ static void append_decl_element(struct wined3d_fvf_convert_state *state, ...@@ -297,6 +301,8 @@ static void append_decl_element(struct wined3d_fvf_convert_state *state,
elements[idx].input_slot = 0; elements[idx].input_slot = 0;
elements[idx].offset = offset; elements[idx].offset = offset;
elements[idx].output_slot = WINED3D_OUTPUT_SLOT_SEMANTIC; elements[idx].output_slot = WINED3D_OUTPUT_SLOT_SEMANTIC;
elements[idx].input_slot_class = WINED3D_INPUT_PER_VERTEX_DATA;
elements[idx].instance_data_step_rate = 0;
elements[idx].method = WINED3D_DECL_METHOD_DEFAULT; elements[idx].method = WINED3D_DECL_METHOD_DEFAULT;
elements[idx].usage = usage; elements[idx].usage = usage;
elements[idx].usage_idx = usage_idx; elements[idx].usage_idx = usage_idx;
......
...@@ -981,7 +981,8 @@ struct wined3d_stream_info_element ...@@ -981,7 +981,8 @@ struct wined3d_stream_info_element
const struct wined3d_format *format; const struct wined3d_format *format;
struct wined3d_bo_address data; struct wined3d_bo_address data;
GLsizei stride; GLsizei stride;
UINT stream_idx; unsigned int stream_idx;
unsigned int divisor;
}; };
struct wined3d_stream_info struct wined3d_stream_info
...@@ -2424,7 +2425,9 @@ struct wined3d_vertex_declaration_element ...@@ -2424,7 +2425,9 @@ struct wined3d_vertex_declaration_element
BOOL ffp_valid; BOOL ffp_valid;
unsigned int input_slot; unsigned int input_slot;
unsigned int offset; unsigned int offset;
UINT output_slot; unsigned int output_slot;
enum wined3d_input_classification input_slot_class;
unsigned int instance_data_step_rate;
BYTE method; BYTE method;
BYTE usage; BYTE usage;
BYTE usage_idx; BYTE usage_idx;
...@@ -2764,6 +2767,7 @@ const char *debug_d3dusage(DWORD usage) DECLSPEC_HIDDEN; ...@@ -2764,6 +2767,7 @@ const char *debug_d3dusage(DWORD usage) DECLSPEC_HIDDEN;
const char *debug_d3dusagequery(DWORD usagequery) DECLSPEC_HIDDEN; const char *debug_d3dusagequery(DWORD usagequery) DECLSPEC_HIDDEN;
const char *debug_d3ddeclmethod(enum wined3d_decl_method method) DECLSPEC_HIDDEN; const char *debug_d3ddeclmethod(enum wined3d_decl_method method) DECLSPEC_HIDDEN;
const char *debug_d3ddeclusage(enum wined3d_decl_usage usage) DECLSPEC_HIDDEN; const char *debug_d3ddeclusage(enum wined3d_decl_usage usage) DECLSPEC_HIDDEN;
const char *debug_d3dinput_classification(enum wined3d_input_classification classification) DECLSPEC_HIDDEN;
const char *debug_d3dprimitivetype(enum wined3d_primitive_type primitive_type) DECLSPEC_HIDDEN; const char *debug_d3dprimitivetype(enum wined3d_primitive_type primitive_type) DECLSPEC_HIDDEN;
const char *debug_d3drenderstate(enum wined3d_render_state state) DECLSPEC_HIDDEN; const char *debug_d3drenderstate(enum wined3d_render_state state) DECLSPEC_HIDDEN;
const char *debug_d3dsamplerstate(enum wined3d_sampler_state state) DECLSPEC_HIDDEN; const char *debug_d3dsamplerstate(enum wined3d_sampler_state state) DECLSPEC_HIDDEN;
......
...@@ -1665,12 +1665,20 @@ struct wined3d_clip_status ...@@ -1665,12 +1665,20 @@ struct wined3d_clip_status
DWORD clip_intersection; DWORD clip_intersection;
}; };
enum wined3d_input_classification
{
WINED3D_INPUT_PER_VERTEX_DATA,
WINED3D_INPUT_PER_INSTANCE_DATA,
};
struct wined3d_vertex_element struct wined3d_vertex_element
{ {
enum wined3d_format_id format; enum wined3d_format_id format;
unsigned int input_slot; unsigned int input_slot;
unsigned int offset; unsigned int offset;
UINT output_slot; /* D3D 8 & 10 */ unsigned int output_slot; /* D3D 8 & 10 */
enum wined3d_input_classification input_slot_class;
unsigned int instance_data_step_rate;
BYTE method; BYTE method;
BYTE usage; BYTE usage;
BYTE usage_idx; BYTE usage_idx;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment