wined3d: Move the decoded stream info into the context.
This commit is contained in:
parent
a0b56d9c59
commit
d8c43aabf7
|
@ -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,
|
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)
|
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;
|
UINT i;
|
||||||
DWORD new_size;
|
DWORD new_size;
|
||||||
struct arb_vs_compiled_shader *new_array;
|
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,
|
const struct wined3d_context *context, const struct wined3d_shader *shader,
|
||||||
struct arb_ps_compile_args *args)
|
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_gl_info *gl_info = context->gl_info;
|
||||||
const struct wined3d_d3d_info *d3d_info = context->d3d_info;
|
const struct wined3d_d3d_info *d3d_info = context->d3d_info;
|
||||||
int i;
|
int i;
|
||||||
WORD int_skip;
|
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 */
|
/* This forces all local boolean constants to 1 to make them stateblock independent */
|
||||||
args->bools = shader->reg_maps.local_bool_consts;
|
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;
|
int i;
|
||||||
WORD int_skip;
|
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;
|
args->clip.boolclip_compare = 0;
|
||||||
if (use_ps(state))
|
if (use_ps(state))
|
||||||
|
@ -4747,7 +4743,8 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context
|
||||||
else
|
else
|
||||||
ps_input_sig = state->pixel_shader->input_signature;
|
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->current_vprogram_id = compiled->prgId;
|
||||||
priv->compiled_vprog = compiled;
|
priv->compiled_vprog = compiled;
|
||||||
|
|
||||||
|
|
|
@ -776,7 +776,7 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte
|
||||||
fixup_flags |= WINED3D_BUFFER_FIXUP_XYZRHW;
|
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;
|
buffer->flags |= WINED3D_BUFFER_HASDESC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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. */
|
/* Context activation is done by the caller. */
|
||||||
BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device)
|
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_update_tex_unit_map(device);
|
||||||
device_preload_textures(device);
|
device_preload_textures(device);
|
||||||
if (isStateDirty(context, STATE_VDECL) || isStateDirty(context, STATE_STREAMSRC))
|
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 (state->index_buffer)
|
||||||
{
|
{
|
||||||
if (device->stream_info.all_vbo)
|
if (context->stream_info.all_vbo)
|
||||||
buffer_internal_preload(state->index_buffer, context);
|
buffer_internal_preload(state->index_buffer, context);
|
||||||
else
|
else
|
||||||
buffer_get_sysmem(state->index_buffer, context);
|
buffer_get_sysmem(state->index_buffer, context);
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
#include "wined3d_private.h"
|
#include "wined3d_private.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
|
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
|
||||||
WINE_DECLARE_DEBUG_CHANNEL(d3d_perf);
|
|
||||||
|
|
||||||
/* Define the default light parameters as specified by MSDN. */
|
/* Define the default light parameters as specified by MSDN. */
|
||||||
const struct wined3d_light WINED3D_default_light =
|
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)
|
static void device_preload_texture(const struct wined3d_state *state, unsigned int idx)
|
||||||
{
|
{
|
||||||
struct wined3d_texture *texture;
|
struct wined3d_texture *texture;
|
||||||
|
@ -3541,7 +3330,7 @@ HRESULT CDECL wined3d_device_process_vertices(struct wined3d_device *device,
|
||||||
|
|
||||||
vs = state->vertex_shader;
|
vs = state->vertex_shader;
|
||||||
state->vertex_shader = NULL;
|
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;
|
state->vertex_shader = vs;
|
||||||
|
|
||||||
/* We can't convert FROM a VBO, and vertex buffers used to source into
|
/* We can't convert FROM a VBO, and vertex buffers used to source into
|
||||||
|
|
|
@ -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");
|
FIXME("Point sprite coordinate origin switching not supported.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
stream_info = &device->stream_info;
|
stream_info = &context->stream_info;
|
||||||
if (device->instance_count)
|
if (device->instance_count)
|
||||||
instance_count = 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)
|
if (emulation)
|
||||||
{
|
{
|
||||||
si_emulated = device->stream_info;
|
si_emulated = context->stream_info;
|
||||||
remove_vbos(context, state, &si_emulated);
|
remove_vbos(context, state, &si_emulated);
|
||||||
stream_info = &si_emulated;
|
stream_info = &si_emulated;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device->useDrawStridedSlow || emulation)
|
if (context->use_immediate_mode_draw || emulation)
|
||||||
{
|
{
|
||||||
/* Immediate mode drawing. */
|
/* Immediate mode drawing. */
|
||||||
if (use_vs(state))
|
if (use_vs(state))
|
||||||
|
@ -769,9 +769,9 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co
|
||||||
|
|
||||||
if (ib_query)
|
if (ib_query)
|
||||||
wined3d_event_query_issue(ib_query, device);
|
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)
|
if (wined3d_settings.strict_draw_ordering)
|
||||||
|
|
|
@ -4735,7 +4735,7 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
|
||||||
{
|
{
|
||||||
UINT i;
|
UINT i;
|
||||||
DWORD new_size;
|
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_vs_compiled_shader *gl_shaders, *new_array;
|
||||||
struct glsl_shader_private *shader_data;
|
struct glsl_shader_private *shader_data;
|
||||||
GLhandleARB ret;
|
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;
|
struct vs_compile_args vs_compile_args;
|
||||||
vshader = state->vertex_shader;
|
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_id = find_glsl_vshader(context, &priv->shader_buffer, vshader, &vs_compile_args);
|
||||||
vs_list = &vshader->linked_programs;
|
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 glsl_ffp_vertex_shader *ffp_shader;
|
||||||
struct wined3d_ffp_vs_settings settings;
|
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);
|
ffp_shader = shader_glsl_find_ffp_vertex_shader(priv, gl_info, &settings);
|
||||||
vs_id = ffp_shader->id;
|
vs_id = ffp_shader->id;
|
||||||
vs_list = &ffp_shader->linked_programs;
|
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;
|
struct ps_compile_args ps_compile_args;
|
||||||
pshader = state->pixel_shader;
|
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,
|
ps_id = find_glsl_pshader(context, &priv->shader_buffer,
|
||||||
pshader, &ps_compile_args, &np2fixup_info);
|
pshader, &ps_compile_args, &np2fixup_info);
|
||||||
ps_list = &pshader->linked_programs;
|
ps_list = &pshader->linked_programs;
|
||||||
|
|
|
@ -87,7 +87,7 @@ static void state_lighting(struct wined3d_context *context, const struct wined3d
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (state->render_states[WINED3D_RS_LIGHTING]
|
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);
|
gl_info->gl_ops.gl.p_glEnable(GL_LIGHTING);
|
||||||
checkGLcall("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 (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);
|
gl_info->gl_ops.gl.p_glEnable(GL_DEPTH_CLAMP);
|
||||||
checkGLcall("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)
|
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;
|
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||||
GLenum Parm = 0;
|
GLenum Parm = 0;
|
||||||
|
|
||||||
|
@ -1263,7 +1262,7 @@ static void state_colormat(struct wined3d_context *context, const struct wined3d
|
||||||
}
|
}
|
||||||
|
|
||||||
context->num_untracked_materials = 0;
|
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])
|
&& state->render_states[WINED3D_RS_COLORVERTEX])
|
||||||
{
|
{
|
||||||
TRACE("diff %d, amb %d, emis %d, spec %d\n",
|
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
|
* by zero and is not properly defined in opengl, so avoid it
|
||||||
*/
|
*/
|
||||||
if (state->render_states[WINED3D_RS_NORMALIZENORMALS]
|
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);
|
gl_info->gl_ops.gl.p_glEnable(GL_NORMALIZE);
|
||||||
checkGLcall("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],
|
set_texture_matrix(gl_info, &state->transforms[WINED3D_TS_TEXTURE0 + texUnit].u.m[0][0],
|
||||||
state->texture_states[texUnit][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS],
|
state->texture_states[texUnit][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS],
|
||||||
generated, context->last_was_rhw,
|
generated, context->last_was_rhw,
|
||||||
device->stream_info.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx))
|
context->stream_info.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx))
|
||||||
? device->stream_info.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format->id
|
? context->stream_info.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format->id
|
||||||
: WINED3DFMT_UNKNOWN,
|
: WINED3DFMT_UNKNOWN,
|
||||||
device->shader_backend->shader_has_ffp_proj_control(device->shader_priv));
|
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;
|
GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0;
|
||||||
|
|
||||||
unload_tex_coords(gl_info);
|
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)
|
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) && !context->use_immediate_mode_draw;
|
||||||
BOOL load_numbered = use_vs(state) && !device->useDrawStridedSlow;
|
BOOL load_named = !use_vs(state) && !context->use_immediate_mode_draw;
|
||||||
BOOL load_named = !use_vs(state) && !device->useDrawStridedSlow;
|
|
||||||
|
|
||||||
if (isStateDirty(context, STATE_VDECL)) return;
|
if (isStateDirty(context, STATE_VDECL)) return;
|
||||||
if (context->numberedArraysLoaded && !load_numbered)
|
if (context->numberedArraysLoaded && !load_numbered)
|
||||||
|
@ -4498,13 +4496,13 @@ static void streamsrc(struct wined3d_context *context, const struct wined3d_stat
|
||||||
if (load_numbered)
|
if (load_numbered)
|
||||||
{
|
{
|
||||||
TRACE("Loading numbered arrays\n");
|
TRACE("Loading numbered arrays\n");
|
||||||
load_numbered_arrays(context, &device->stream_info, state);
|
load_numbered_arrays(context, &context->stream_info, state);
|
||||||
context->numberedArraysLoaded = TRUE;
|
context->numberedArraysLoaded = TRUE;
|
||||||
}
|
}
|
||||||
else if (load_named)
|
else if (load_named)
|
||||||
{
|
{
|
||||||
TRACE("Loading vertex data\n");
|
TRACE("Loading vertex data\n");
|
||||||
load_vertex_data(context, &device->stream_info, state);
|
load_vertex_data(context, &context->stream_info, state);
|
||||||
context->namedArraysLoaded = TRUE;
|
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)
|
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;
|
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||||
BOOL useVertexShaderFunction = use_vs(state);
|
BOOL useVertexShaderFunction = use_vs(state);
|
||||||
BOOL updateFog = FALSE;
|
BOOL updateFog = FALSE;
|
||||||
|
@ -4526,7 +4523,7 @@ void vertexdeclaration(struct wined3d_context *context, const struct wined3d_sta
|
||||||
BOOL wasrhw = context->last_was_rhw;
|
BOOL wasrhw = context->last_was_rhw;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
transformed = device->stream_info.position_transformed;
|
transformed = context->stream_info.position_transformed;
|
||||||
if (transformed != context->last_was_rhw && !useVertexShaderFunction)
|
if (transformed != context->last_was_rhw && !useVertexShaderFunction)
|
||||||
updateFog = TRUE;
|
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)
|
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;
|
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||||
|
|
||||||
if (!state->index_buffer || !stream_info->all_vbo)
|
if (!state->index_buffer || !stream_info->all_vbo)
|
||||||
|
|
|
@ -1083,7 +1083,7 @@ struct wined3d_context
|
||||||
DWORD current : 1;
|
DWORD current : 1;
|
||||||
DWORD destroyed : 1;
|
DWORD destroyed : 1;
|
||||||
DWORD valid : 1;
|
DWORD valid : 1;
|
||||||
DWORD padding : 1;
|
DWORD use_immediate_mode_draw : 1;
|
||||||
DWORD texShaderBumpMap : 8; /* MAX_TEXTURES, 8 */
|
DWORD texShaderBumpMap : 8; /* MAX_TEXTURES, 8 */
|
||||||
DWORD lastWasPow2Texture : 8; /* MAX_TEXTURES, 8 */
|
DWORD lastWasPow2Texture : 8; /* MAX_TEXTURES, 8 */
|
||||||
DWORD shader_update_mask;
|
DWORD shader_update_mask;
|
||||||
|
@ -1132,6 +1132,12 @@ struct wined3d_context
|
||||||
UINT free_event_query_count;
|
UINT free_event_query_count;
|
||||||
struct list event_queries;
|
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 */
|
/* Extension emulation */
|
||||||
GLint gl_fog_source;
|
GLint gl_fog_source;
|
||||||
GLfloat fog_coord_value;
|
GLfloat fog_coord_value;
|
||||||
|
@ -1299,6 +1305,8 @@ void context_state_drawbuf(struct wined3d_context *context,
|
||||||
void context_state_fb(struct wined3d_context *context,
|
void context_state_fb(struct wined3d_context *context,
|
||||||
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
|
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_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
|
* Internal representation of a light
|
||||||
|
@ -1880,9 +1888,8 @@ struct wined3d_device
|
||||||
WORD d3d_initialized : 1;
|
WORD d3d_initialized : 1;
|
||||||
WORD inScene : 1; /* A flag to check for proper BeginScene / EndScene call pairs */
|
WORD inScene : 1; /* A flag to check for proper BeginScene / EndScene call pairs */
|
||||||
WORD softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */
|
WORD softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */
|
||||||
WORD useDrawStridedSlow : 1;
|
|
||||||
WORD filter_messages : 1;
|
WORD filter_messages : 1;
|
||||||
WORD padding : 8;
|
WORD padding : 9;
|
||||||
|
|
||||||
BYTE fixed_function_usage_map; /* MAX_TEXTURES, 8 */
|
BYTE fixed_function_usage_map; /* MAX_TEXTURES, 8 */
|
||||||
|
|
||||||
|
@ -1932,11 +1939,6 @@ struct wined3d_device
|
||||||
DWORD texUnitMap[MAX_COMBINED_SAMPLERS];
|
DWORD texUnitMap[MAX_COMBINED_SAMPLERS];
|
||||||
DWORD rev_tex_unit_map[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 */
|
/* Context management */
|
||||||
struct wined3d_context **contexts;
|
struct wined3d_context **contexts;
|
||||||
UINT context_count;
|
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_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,
|
void device_switch_onscreen_ds(struct wined3d_device *device, struct wined3d_context *context,
|
||||||
struct wined3d_surface *depth_stencil) DECLSPEC_HIDDEN;
|
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_update_tex_unit_map(struct wined3d_device *device) DECLSPEC_HIDDEN;
|
||||||
void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN;
|
void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue