diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 2972e194ebb..c7194e45720 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -4430,12 +4430,9 @@ static inline BOOL vs_args_equal(const struct arb_vs_compile_args *stored, const } static struct arb_vs_compiled_shader *find_arb_vshader(struct wined3d_shader *shader, - const struct arb_vs_compile_args *args, + const struct wined3d_gl_info *gl_info, DWORD use_map, const struct arb_vs_compile_args *args, const struct wined3d_shader_signature_element *ps_input_sig) { - struct wined3d_device *device = shader->device; - const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - DWORD use_map = device->stream_info.use_map; UINT i; DWORD new_size; struct arb_vs_compiled_shader *new_array; @@ -4521,13 +4518,12 @@ static void find_arb_ps_compile_args(const struct wined3d_state *state, const struct wined3d_context *context, const struct wined3d_shader *shader, struct arb_ps_compile_args *args) { - const struct wined3d_device *device = shader->device; const struct wined3d_gl_info *gl_info = context->gl_info; const struct wined3d_d3d_info *d3d_info = context->d3d_info; int i; WORD int_skip; - find_ps_compile_args(state, shader, device->stream_info.position_transformed, &args->super, gl_info); + find_ps_compile_args(state, shader, context->stream_info.position_transformed, &args->super, gl_info); /* This forces all local boolean constants to 1 to make them stateblock independent */ args->bools = shader->reg_maps.local_bool_consts; @@ -4585,7 +4581,7 @@ static void find_arb_vs_compile_args(const struct wined3d_state *state, int i; WORD int_skip; - find_vs_compile_args(state, shader, device->stream_info.swizzle_map, &args->super); + find_vs_compile_args(state, shader, context->stream_info.swizzle_map, &args->super); args->clip.boolclip_compare = 0; if (use_ps(state)) @@ -4747,7 +4743,8 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context else ps_input_sig = state->pixel_shader->input_signature; - compiled = find_arb_vshader(vs, &compile_args, ps_input_sig); + compiled = find_arb_vshader(vs, context->gl_info, context->stream_info.use_map, + &compile_args, ps_input_sig); priv->current_vprogram_id = compiled->prgId; priv->compiled_vprog = compiled; diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index ecd47ebdf57..84fe45a6193 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -776,7 +776,7 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte fixup_flags |= WINED3D_BUFFER_FIXUP_XYZRHW; } - decl_changed = buffer_find_decl(buffer, &device->stream_info, fixup_flags); + decl_changed = buffer_find_decl(buffer, &context->stream_info, fixup_flags); buffer->flags |= WINED3D_BUFFER_HASDESC; } diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 026158d22fe..f8707005d43 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -2345,6 +2345,217 @@ void context_state_drawbuf(struct wined3d_context *context, const struct wined3d } } +static BOOL fixed_get_input(BYTE usage, BYTE usage_idx, unsigned int *regnum) +{ + if ((usage == WINED3D_DECL_USAGE_POSITION || usage == WINED3D_DECL_USAGE_POSITIONT) && !usage_idx) + *regnum = WINED3D_FFP_POSITION; + else if (usage == WINED3D_DECL_USAGE_BLEND_WEIGHT && !usage_idx) + *regnum = WINED3D_FFP_BLENDWEIGHT; + else if (usage == WINED3D_DECL_USAGE_BLEND_INDICES && !usage_idx) + *regnum = WINED3D_FFP_BLENDINDICES; + else if (usage == WINED3D_DECL_USAGE_NORMAL && !usage_idx) + *regnum = WINED3D_FFP_NORMAL; + else if (usage == WINED3D_DECL_USAGE_PSIZE && !usage_idx) + *regnum = WINED3D_FFP_PSIZE; + else if (usage == WINED3D_DECL_USAGE_COLOR && !usage_idx) + *regnum = WINED3D_FFP_DIFFUSE; + else if (usage == WINED3D_DECL_USAGE_COLOR && usage_idx == 1) + *regnum = WINED3D_FFP_SPECULAR; + else if (usage == WINED3D_DECL_USAGE_TEXCOORD && usage_idx < WINED3DDP_MAXTEXCOORD) + *regnum = WINED3D_FFP_TEXCOORD0 + usage_idx; + else + { + FIXME("Unsupported input stream [usage=%s, usage_idx=%u].\n", debug_d3ddeclusage(usage), usage_idx); + *regnum = ~0U; + return FALSE; + } + + return TRUE; +} + +/* FIXME: Separate buffer loading from declaration decoding */ +/* Context activation is done by the caller. */ +void context_stream_info_from_declaration(struct wined3d_context *context, + const struct wined3d_state *state, struct wined3d_stream_info *stream_info) +{ + /* We need to deal with frequency data! */ + struct wined3d_vertex_declaration *declaration = state->vertex_declaration; + BOOL use_vshader; + unsigned int i; + WORD map; + + stream_info->use_map = 0; + stream_info->swizzle_map = 0; + stream_info->all_vbo = 1; + + /* Check for transformed vertices, disable vertex shader if present. */ + stream_info->position_transformed = declaration->position_transformed; + use_vshader = state->vertex_shader && !declaration->position_transformed; + + /* Translate the declaration into strided data. */ + for (i = 0; i < declaration->element_count; ++i) + { + const struct wined3d_vertex_declaration_element *element = &declaration->elements[i]; + const struct wined3d_stream_state *stream = &state->streams[element->input_slot]; + struct wined3d_buffer *buffer = stream->buffer; + struct wined3d_bo_address data; + BOOL stride_used; + unsigned int idx; + DWORD stride; + + TRACE("%p Element %p (%u of %u).\n", declaration->elements, + element, i + 1, declaration->element_count); + + if (!buffer) continue; + + stride = stream->stride; + TRACE("Stream %u in buffer %p.\n", element->input_slot, buffer); + buffer_get_memory(buffer, context, &data); + + /* Can't use vbo's if the base vertex index is negative. OpenGL doesn't accept negative offsets + * (or rather offsets bigger than the vbo, because the pointer is unsigned), so use system memory + * sources. In most sane cases the pointer - offset will still be > 0, otherwise it will wrap + * around to some big value. Hope that with the indices, the driver wraps it back internally. If + * not, drawStridedSlow is needed, including a vertex buffer path. */ + if (state->load_base_vertex_index < 0) + { + WARN_(d3d_perf)("load_base_vertex_index is < 0 (%d), not using VBOs.\n", + state->load_base_vertex_index); + data.buffer_object = 0; + data.addr = buffer_get_sysmem(buffer, context); + if ((UINT_PTR)data.addr < -state->load_base_vertex_index * stride) + { + FIXME("System memory vertex data load offset is negative!\n"); + } + } + data.addr += element->offset; + + TRACE("offset %u input_slot %u usage_idx %d.\n", element->offset, element->input_slot, element->usage_idx); + + if (use_vshader) + { + if (element->output_slot == ~0U) + { + /* TODO: Assuming vertexdeclarations are usually used with the + * same or a similar shader, it might be worth it to store the + * last used output slot and try that one first. */ + stride_used = vshader_get_input(state->vertex_shader, + element->usage, element->usage_idx, &idx); + } + else + { + idx = element->output_slot; + stride_used = TRUE; + } + } + else + { + if (!element->ffp_valid) + { + WARN("Skipping unsupported fixed function element of format %s and usage %s.\n", + debug_d3dformat(element->format->id), debug_d3ddeclusage(element->usage)); + stride_used = FALSE; + } + else + { + stride_used = fixed_get_input(element->usage, element->usage_idx, &idx); + } + } + + if (stride_used) + { + TRACE("Load %s array %u [usage %s, usage_idx %u, " + "input_slot %u, offset %u, stride %u, format %s, buffer_object %u].\n", + use_vshader ? "shader": "fixed function", idx, + debug_d3ddeclusage(element->usage), element->usage_idx, element->input_slot, + element->offset, stride, debug_d3dformat(element->format->id), data.buffer_object); + + data.addr += stream->offset; + + stream_info->elements[idx].format = element->format; + stream_info->elements[idx].data = data; + stream_info->elements[idx].stride = stride; + stream_info->elements[idx].stream_idx = element->input_slot; + + if (!context->gl_info->supported[ARB_VERTEX_ARRAY_BGRA] + && element->format->id == WINED3DFMT_B8G8R8A8_UNORM) + { + stream_info->swizzle_map |= 1 << idx; + } + stream_info->use_map |= 1 << idx; + } + } + + /* Preload the vertex buffers. */ + context->num_buffer_queries = 0; + for (i = 0, map = stream_info->use_map; map; map >>= 1, ++i) + { + struct wined3d_stream_info_element *element; + struct wined3d_buffer *buffer; + + if (!(map & 1)) + continue; + + element = &stream_info->elements[i]; + buffer = state->streams[element->stream_idx].buffer; + buffer_internal_preload(buffer, context); + + /* If the preload dropped the buffer object, update the stream info. */ + if (buffer->buffer_object != element->data.buffer_object) + { + element->data.buffer_object = 0; + element->data.addr = buffer_get_sysmem(buffer, context) + + (ptrdiff_t)element->data.addr; + } + + if (!buffer->buffer_object) + stream_info->all_vbo = 0; + + if (buffer->query) + context->buffer_queries[context->num_buffer_queries++] = buffer->query; + } +} + +/* Context activation is done by the caller. */ +static void context_update_stream_info(struct wined3d_context *context, const struct wined3d_state *state) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_d3d_info *d3d_info = context->d3d_info; + struct wined3d_stream_info *stream_info = &context->stream_info; + DWORD prev_all_vbo = stream_info->all_vbo; + + TRACE("============================= Vertex Declaration =============================\n"); + context_stream_info_from_declaration(context, state, stream_info); + + if (state->vertex_shader && !stream_info->position_transformed) + { + if (state->vertex_declaration->half_float_conv_needed && !stream_info->all_vbo) + { + TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n"); + context->use_immediate_mode_draw = TRUE; + } + else + { + context->use_immediate_mode_draw = FALSE; + } + } + else + { + WORD slow_mask = (1 << WINED3D_FFP_PSIZE); + slow_mask |= -!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] + & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR)); + + if (((stream_info->position_transformed && !d3d_info->xyzrhw) + || (stream_info->use_map & slow_mask)) && !stream_info->all_vbo) + context->use_immediate_mode_draw = TRUE; + else + context->use_immediate_mode_draw = FALSE; + } + + if (prev_all_vbo != stream_info->all_vbo) + context_invalidate_state(context, STATE_INDEXBUFFER); +} + /* Context activation is done by the caller. */ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device) { @@ -2368,10 +2579,10 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de device_update_tex_unit_map(device); device_preload_textures(device); if (isStateDirty(context, STATE_VDECL) || isStateDirty(context, STATE_STREAMSRC)) - device_update_stream_info(device, context); + context_update_stream_info(context, state); if (state->index_buffer) { - if (device->stream_info.all_vbo) + if (context->stream_info.all_vbo) buffer_internal_preload(state->index_buffer, context); else buffer_get_sysmem(state->index_buffer, context); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index ef0ba9e6a3d..656a3e95fd1 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -35,7 +35,6 @@ #include "wined3d_private.h" WINE_DEFAULT_DEBUG_CHANNEL(d3d); -WINE_DECLARE_DEBUG_CHANNEL(d3d_perf); /* Define the default light parameters as specified by MSDN. */ const struct wined3d_light WINED3D_default_light = @@ -135,216 +134,6 @@ static enum wined3d_primitive_type d3d_primitive_type_from_gl(GLenum primitive_t } } -static BOOL fixed_get_input(BYTE usage, BYTE usage_idx, unsigned int *regnum) -{ - if ((usage == WINED3D_DECL_USAGE_POSITION || usage == WINED3D_DECL_USAGE_POSITIONT) && !usage_idx) - *regnum = WINED3D_FFP_POSITION; - else if (usage == WINED3D_DECL_USAGE_BLEND_WEIGHT && !usage_idx) - *regnum = WINED3D_FFP_BLENDWEIGHT; - else if (usage == WINED3D_DECL_USAGE_BLEND_INDICES && !usage_idx) - *regnum = WINED3D_FFP_BLENDINDICES; - else if (usage == WINED3D_DECL_USAGE_NORMAL && !usage_idx) - *regnum = WINED3D_FFP_NORMAL; - else if (usage == WINED3D_DECL_USAGE_PSIZE && !usage_idx) - *regnum = WINED3D_FFP_PSIZE; - else if (usage == WINED3D_DECL_USAGE_COLOR && !usage_idx) - *regnum = WINED3D_FFP_DIFFUSE; - else if (usage == WINED3D_DECL_USAGE_COLOR && usage_idx == 1) - *regnum = WINED3D_FFP_SPECULAR; - else if (usage == WINED3D_DECL_USAGE_TEXCOORD && usage_idx < WINED3DDP_MAXTEXCOORD) - *regnum = WINED3D_FFP_TEXCOORD0 + usage_idx; - else - { - FIXME("Unsupported input stream [usage=%s, usage_idx=%u]\n", debug_d3ddeclusage(usage), usage_idx); - *regnum = ~0U; - return FALSE; - } - - return TRUE; -} - -/* Context activation is done by the caller. */ -static void device_stream_info_from_declaration(struct wined3d_device *device, struct wined3d_stream_info *stream_info, - struct wined3d_context *context) -{ - const struct wined3d_state *state = &device->state; - /* We need to deal with frequency data! */ - struct wined3d_vertex_declaration *declaration = state->vertex_declaration; - BOOL use_vshader; - unsigned int i; - WORD map; - - stream_info->use_map = 0; - stream_info->swizzle_map = 0; - stream_info->all_vbo = 1; - - /* Check for transformed vertices, disable vertex shader if present. */ - stream_info->position_transformed = declaration->position_transformed; - use_vshader = state->vertex_shader && !declaration->position_transformed; - - /* Translate the declaration into strided data. */ - for (i = 0; i < declaration->element_count; ++i) - { - const struct wined3d_vertex_declaration_element *element = &declaration->elements[i]; - const struct wined3d_stream_state *stream = &state->streams[element->input_slot]; - struct wined3d_buffer *buffer = stream->buffer; - struct wined3d_bo_address data; - BOOL stride_used; - unsigned int idx; - DWORD stride; - - TRACE("%p Element %p (%u of %u)\n", declaration->elements, - element, i + 1, declaration->element_count); - - if (!buffer) continue; - - stride = stream->stride; - - TRACE("Stream %u, buffer %p.\n", element->input_slot, buffer); - buffer_get_memory(buffer, context, &data); - - /* We can't use VBOs if the base vertex index is negative. OpenGL - * doesn't accept negative offsets (or rather offsets bigger than the - * VBO, because the pointer is unsigned), so use system memory - * sources. In most sane cases the pointer - offset will still be > 0, - * otherwise it will wrap around to some big value. Hope that with the - * indices, the driver wraps it back internally. If not, - * drawStridedSlow() is needed, including a vertex buffer path. */ - if (state->load_base_vertex_index < 0) - { - WARN_(d3d_perf)("load_base_vertex_index is < 0 (%d), not using VBOs.\n", state->load_base_vertex_index); - data.buffer_object = 0; - data.addr = buffer_get_sysmem(buffer, context); - if ((UINT_PTR)data.addr < -state->load_base_vertex_index * stride) - FIXME("System memory vertex data load offset is negative!\n"); - } - data.addr += element->offset; - - TRACE("offset %u input_slot %u usage_idx %d\n", element->offset, element->input_slot, element->usage_idx); - - if (use_vshader) - { - if (element->output_slot == ~0U) - { - /* TODO: Assuming vertexdeclarations are usually used with the - * same or a similar shader, it might be worth it to store the - * last used output slot and try that one first. */ - stride_used = vshader_get_input(state->vertex_shader, - element->usage, element->usage_idx, &idx); - } - else - { - idx = element->output_slot; - stride_used = TRUE; - } - } - else - { - if (!element->ffp_valid) - { - WARN("Skipping unsupported fixed function element of format %s and usage %s\n", - debug_d3dformat(element->format->id), debug_d3ddeclusage(element->usage)); - stride_used = FALSE; - } - else - { - stride_used = fixed_get_input(element->usage, element->usage_idx, &idx); - } - } - - if (stride_used) - { - TRACE("Load %s array %u [usage %s, usage_idx %u, " - "input_slot %u, offset %u, stride %u, format %s, buffer_object %u]\n", - use_vshader ? "shader": "fixed function", idx, - debug_d3ddeclusage(element->usage), element->usage_idx, element->input_slot, - element->offset, stride, debug_d3dformat(element->format->id), data.buffer_object); - - data.addr += stream->offset; - - stream_info->elements[idx].format = element->format; - stream_info->elements[idx].data = data; - stream_info->elements[idx].stride = stride; - stream_info->elements[idx].stream_idx = element->input_slot; - - if (!context->gl_info->supported[ARB_VERTEX_ARRAY_BGRA] - && element->format->id == WINED3DFMT_B8G8R8A8_UNORM) - { - stream_info->swizzle_map |= 1 << idx; - } - stream_info->use_map |= 1 << idx; - } - } - - /* Preload the vertex buffers. */ - device->num_buffer_queries = 0; - for (i = 0, map = stream_info->use_map; map; map >>= 1, ++i) - { - struct wined3d_stream_info_element *element; - struct wined3d_buffer *buffer; - - if (!(map & 1)) - continue; - - element = &stream_info->elements[i]; - buffer = state->streams[element->stream_idx].buffer; - buffer_internal_preload(buffer, context); - - /* If the preload dropped the buffer object, update the stream info. */ - if (buffer->buffer_object != element->data.buffer_object) - { - element->data.buffer_object = 0; - element->data.addr = buffer_get_sysmem(buffer, context) + (ptrdiff_t)element->data.addr; - } - - if (!buffer->buffer_object) - stream_info->all_vbo = 0; - - if (buffer->query) - device->buffer_queries[device->num_buffer_queries++] = buffer->query; - } -} - -/* Context activation is done by the caller. */ -void device_update_stream_info(struct wined3d_device *device, struct wined3d_context *context) -{ - const struct wined3d_gl_info *gl_info = context->gl_info; - struct wined3d_stream_info *stream_info = &device->stream_info; - const struct wined3d_state *state = &device->state; - DWORD prev_all_vbo = stream_info->all_vbo; - - TRACE("============================= Vertex Declaration =============================\n"); - device_stream_info_from_declaration(device, stream_info, context); - - if (state->vertex_shader && !stream_info->position_transformed) - { - if (state->vertex_declaration->half_float_conv_needed && !stream_info->all_vbo) - { - TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n"); - device->useDrawStridedSlow = TRUE; - } - else - { - device->useDrawStridedSlow = FALSE; - } - } - else - { - WORD slow_mask = (1 << WINED3D_FFP_PSIZE); - slow_mask |= -!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] - & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR)); - - if (((stream_info->position_transformed && !device->adapter->d3d_info.xyzrhw) - || (stream_info->use_map & slow_mask)) && !stream_info->all_vbo) - device->useDrawStridedSlow = TRUE; - else - device->useDrawStridedSlow = FALSE; - } - - if (prev_all_vbo != stream_info->all_vbo) - device_invalidate_state(device, STATE_INDEXBUFFER); -} - static void device_preload_texture(const struct wined3d_state *state, unsigned int idx) { struct wined3d_texture *texture; @@ -3541,7 +3330,7 @@ HRESULT CDECL wined3d_device_process_vertices(struct wined3d_device *device, vs = state->vertex_shader; state->vertex_shader = NULL; - device_stream_info_from_declaration(device, &stream_info, context); + context_stream_info_from_declaration(context, state, &stream_info); state->vertex_shader = vs; /* We can't convert FROM a VBO, and vertex buffers used to source into diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index c483921bf00..42f6cb709c7 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -678,7 +678,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co FIXME("Point sprite coordinate origin switching not supported.\n"); } - stream_info = &device->stream_info; + stream_info = &context->stream_info; if (device->instance_count) instance_count = device->instance_count; @@ -728,13 +728,13 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co if (emulation) { - si_emulated = device->stream_info; + si_emulated = context->stream_info; remove_vbos(context, state, &si_emulated); stream_info = &si_emulated; } } - if (device->useDrawStridedSlow || emulation) + if (context->use_immediate_mode_draw || emulation) { /* Immediate mode drawing. */ if (use_vs(state)) @@ -769,9 +769,9 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co if (ib_query) wined3d_event_query_issue(ib_query, device); - for (i = 0; i < device->num_buffer_queries; ++i) + for (i = 0; i < context->num_buffer_queries; ++i) { - wined3d_event_query_issue(device->buffer_queries[i], device); + wined3d_event_query_issue(context->buffer_queries[i], device); } if (wined3d_settings.strict_draw_ordering) diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 24130957eea..67de5ea2de1 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4735,7 +4735,7 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context, { UINT i; DWORD new_size; - DWORD use_map = shader->device->stream_info.use_map; + DWORD use_map = context->stream_info.use_map; struct glsl_vs_compiled_shader *gl_shaders, *new_array; struct glsl_shader_private *shader_data; GLhandleARB ret; @@ -5807,7 +5807,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const struct vs_compile_args vs_compile_args; vshader = state->vertex_shader; - find_vs_compile_args(state, vshader, device->stream_info.swizzle_map, &vs_compile_args); + find_vs_compile_args(state, vshader, context->stream_info.swizzle_map, &vs_compile_args); vs_id = find_glsl_vshader(context, &priv->shader_buffer, vshader, &vs_compile_args); vs_list = &vshader->linked_programs; @@ -5819,7 +5819,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const struct glsl_ffp_vertex_shader *ffp_shader; struct wined3d_ffp_vs_settings settings; - wined3d_ffp_get_vs_settings(state, &device->stream_info, &settings); + wined3d_ffp_get_vs_settings(state, &context->stream_info, &settings); ffp_shader = shader_glsl_find_ffp_vertex_shader(priv, gl_info, &settings); vs_id = ffp_shader->id; vs_list = &ffp_shader->linked_programs; @@ -5837,7 +5837,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const { struct ps_compile_args ps_compile_args; pshader = state->pixel_shader; - find_ps_compile_args(state, pshader, device->stream_info.position_transformed, &ps_compile_args, gl_info); + find_ps_compile_args(state, pshader, context->stream_info.position_transformed, &ps_compile_args, gl_info); ps_id = find_glsl_pshader(context, &priv->shader_buffer, pshader, &ps_compile_args, &np2fixup_info); ps_list = &pshader->linked_programs; diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 5f80620e0f7..36d9108ce5f 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -87,7 +87,7 @@ static void state_lighting(struct wined3d_context *context, const struct wined3d return; if (state->render_states[WINED3D_RS_LIGHTING] - && !context->swapchain->device->stream_info.position_transformed) + && !context->stream_info.position_transformed) { gl_info->gl_ops.gl.p_glEnable(GL_LIGHTING); checkGLcall("glEnable GL_LIGHTING"); @@ -134,7 +134,7 @@ static void state_zenable(struct wined3d_context *context, const struct wined3d_ if (context->gl_info->supported[ARB_DEPTH_CLAMP]) { - if (!zenable && context->swapchain->device->stream_info.position_transformed) + if (!zenable && context->stream_info.position_transformed) { gl_info->gl_ops.gl.p_glEnable(GL_DEPTH_CLAMP); checkGLcall("glEnable(GL_DEPTH_CLAMP)"); @@ -1250,7 +1250,6 @@ void state_fogdensity(struct wined3d_context *context, const struct wined3d_stat static void state_colormat(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { - const struct wined3d_device *device = context->swapchain->device; const struct wined3d_gl_info *gl_info = context->gl_info; GLenum Parm = 0; @@ -1263,7 +1262,7 @@ static void state_colormat(struct wined3d_context *context, const struct wined3d } context->num_untracked_materials = 0; - if ((device->stream_info.use_map & (1 << WINED3D_FFP_DIFFUSE)) + if ((context->stream_info.use_map & (1 << WINED3D_FFP_DIFFUSE)) && state->render_states[WINED3D_RS_COLORVERTEX]) { TRACE("diff %d, amb %d, emis %d, spec %d\n", @@ -1416,7 +1415,7 @@ static void state_normalize(struct wined3d_context *context, const struct wined3 * by zero and is not properly defined in opengl, so avoid it */ if (state->render_states[WINED3D_RS_NORMALIZENORMALS] - && (context->swapchain->device->stream_info.use_map & (1 << WINED3D_FFP_NORMAL))) + && (context->stream_info.use_map & (1 << WINED3D_FFP_NORMAL))) { gl_info->gl_ops.gl.p_glEnable(GL_NORMALIZE); checkGLcall("glEnable(GL_NORMALIZE);"); @@ -3317,8 +3316,8 @@ void transform_texture(struct wined3d_context *context, const struct wined3d_sta set_texture_matrix(gl_info, &state->transforms[WINED3D_TS_TEXTURE0 + texUnit].u.m[0][0], state->texture_states[texUnit][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS], generated, context->last_was_rhw, - device->stream_info.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)) - ? device->stream_info.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format->id + context->stream_info.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)) + ? context->stream_info.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format->id : WINED3DFMT_UNKNOWN, device->shader_backend->shader_has_ffp_proj_control(device->shader_priv)); @@ -3581,7 +3580,7 @@ static void tex_coordindex(struct wined3d_context *context, const struct wined3d GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0; unload_tex_coords(gl_info); - load_tex_coords(context, &device->stream_info, &curVBO, state); + load_tex_coords(context, &context->stream_info, &curVBO, state); } } @@ -4478,9 +4477,8 @@ static void load_vertex_data(const struct wined3d_context *context, static void streamsrc(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { - const struct wined3d_device *device = context->swapchain->device; - BOOL load_numbered = use_vs(state) && !device->useDrawStridedSlow; - BOOL load_named = !use_vs(state) && !device->useDrawStridedSlow; + BOOL load_numbered = use_vs(state) && !context->use_immediate_mode_draw; + BOOL load_named = !use_vs(state) && !context->use_immediate_mode_draw; if (isStateDirty(context, STATE_VDECL)) return; if (context->numberedArraysLoaded && !load_numbered) @@ -4498,13 +4496,13 @@ static void streamsrc(struct wined3d_context *context, const struct wined3d_stat if (load_numbered) { TRACE("Loading numbered arrays\n"); - load_numbered_arrays(context, &device->stream_info, state); + load_numbered_arrays(context, &context->stream_info, state); context->numberedArraysLoaded = TRUE; } else if (load_named) { TRACE("Loading vertex data\n"); - load_vertex_data(context, &device->stream_info, state); + load_vertex_data(context, &context->stream_info, state); context->namedArraysLoaded = TRUE; } } @@ -4518,7 +4516,6 @@ static void vdecl_miscpart(struct wined3d_context *context, const struct wined3d void vertexdeclaration(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { - const struct wined3d_device *device = context->swapchain->device; const struct wined3d_gl_info *gl_info = context->gl_info; BOOL useVertexShaderFunction = use_vs(state); BOOL updateFog = FALSE; @@ -4526,7 +4523,7 @@ void vertexdeclaration(struct wined3d_context *context, const struct wined3d_sta BOOL wasrhw = context->last_was_rhw; unsigned int i; - transformed = device->stream_info.position_transformed; + transformed = context->stream_info.position_transformed; if (transformed != context->last_was_rhw && !useVertexShaderFunction) updateFog = TRUE; @@ -4847,7 +4844,7 @@ static void scissorrect(struct wined3d_context *context, const struct wined3d_st static void indexbuffer(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { - const struct wined3d_stream_info *stream_info = &context->swapchain->device->stream_info; + const struct wined3d_stream_info *stream_info = &context->stream_info; const struct wined3d_gl_info *gl_info = context->gl_info; if (!state->index_buffer || !stream_info->all_vbo) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 44d6e38194d..a1b72380ff8 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1083,7 +1083,7 @@ struct wined3d_context DWORD current : 1; DWORD destroyed : 1; DWORD valid : 1; - DWORD padding : 1; + DWORD use_immediate_mode_draw : 1; DWORD texShaderBumpMap : 8; /* MAX_TEXTURES, 8 */ DWORD lastWasPow2Texture : 8; /* MAX_TEXTURES, 8 */ DWORD shader_update_mask; @@ -1132,6 +1132,12 @@ struct wined3d_context UINT free_event_query_count; struct list event_queries; + struct wined3d_stream_info stream_info; + + /* Fences for GL_APPLE_flush_buffer_range */ + struct wined3d_event_query *buffer_queries[MAX_ATTRIBS]; + unsigned int num_buffer_queries; + /* Extension emulation */ GLint gl_fog_source; GLfloat fog_coord_value; @@ -1299,6 +1305,8 @@ void context_state_drawbuf(struct wined3d_context *context, void context_state_fb(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN; void context_surface_update(struct wined3d_context *context, const struct wined3d_surface *surface) DECLSPEC_HIDDEN; +void context_stream_info_from_declaration(struct wined3d_context *context, + const struct wined3d_state *state, struct wined3d_stream_info *stream_info) DECLSPEC_HIDDEN; /***************************************************************************** * Internal representation of a light @@ -1880,9 +1888,8 @@ struct wined3d_device WORD d3d_initialized : 1; 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 filter_messages : 1; - WORD padding : 8; + WORD padding : 9; BYTE fixed_function_usage_map; /* MAX_TEXTURES, 8 */ @@ -1932,11 +1939,6 @@ struct wined3d_device DWORD texUnitMap[MAX_COMBINED_SAMPLERS]; DWORD rev_tex_unit_map[MAX_COMBINED_SAMPLERS]; - /* Stream source management */ - struct wined3d_stream_info stream_info; - struct wined3d_event_query *buffer_queries[MAX_ATTRIBS]; - unsigned int num_buffer_queries; - /* Context management */ struct wined3d_context **contexts; UINT context_count; @@ -1957,7 +1959,6 @@ void device_resource_add(struct wined3d_device *device, struct wined3d_resource void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; void device_switch_onscreen_ds(struct wined3d_device *device, struct wined3d_context *context, struct wined3d_surface *depth_stencil) DECLSPEC_HIDDEN; -void device_update_stream_info(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN; void device_update_tex_unit_map(struct wined3d_device *device) DECLSPEC_HIDDEN; void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN;