Stefan Dösinger : wined3d: Separate stream sources and vertex declaration.
Alexandre Julliard
julliard at winehq.org
Mon Jun 27 17:41:22 CDT 2011
Module: wine
Branch: master
Commit: 5e97e2295190b7e8714fefdb2e0bdb76a2af5e72
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e97e2295190b7e8714fefdb2e0bdb76a2af5e72
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Mon Jun 27 17:52:39 2011 +0200
wined3d: Separate stream sources and vertex declaration.
Changing the stream sources does not require a reapplication of the
vertex declaration. Even setting a NULL vertex buffer doesn't make
attributes disappear - it just causes a segfault on Windows.
---
dlls/wined3d/context.c | 2 +-
dlls/wined3d/state.c | 13 ++++++++++---
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index bdf1f37..3af69e8 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2178,7 +2178,7 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de
* updating a resource location. */
device_update_tex_unit_map(device);
device_preload_textures(device);
- if (isStateDirty(context, STATE_VDECL))
+ if (isStateDirty(context, STATE_VDECL) || isStateDirty(context, STATE_STREAMSRC))
device_update_stream_info(device, context->gl_info);
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 77dd1dd..b17a254 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -4468,6 +4468,7 @@ static void streamsrc(DWORD state, struct wined3d_stateblock *stateblock, struct
BOOL load_numbered = use_vs(&stateblock->state) && !device->useDrawStridedSlow;
BOOL load_named = !use_vs(&stateblock->state) && !device->useDrawStridedSlow;
+ if (isStateDirty(context, STATE_VDECL)) return;
if (context->numberedArraysLoaded && !load_numbered)
{
unloadNumberedArrays(context);
@@ -4494,6 +4495,12 @@ static void streamsrc(DWORD state, struct wined3d_stateblock *stateblock, struct
}
}
+static void vdecl_miscpart(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
+{
+ if (isStateDirty(context, STATE_STREAMSRC)) return;
+ streamsrc(state, stateblock, context);
+}
+
static void vertexdeclaration(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
@@ -4884,8 +4891,8 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
- { STATE_STREAMSRC, { STATE_VDECL, NULL }, WINED3D_GL_EXT_NONE },
- { STATE_VDECL, { STATE_VDECL, streamsrc }, WINED3D_GL_EXT_NONE },
+ { STATE_STREAMSRC, { STATE_STREAMSRC, streamsrc }, WINED3D_GL_EXT_NONE },
+ { STATE_VDECL, { STATE_VDECL, vdecl_miscpart }, WINED3D_GL_EXT_NONE },
{ STATE_FRONTFACE, { STATE_FRONTFACE, frontface }, WINED3D_GL_EXT_NONE },
{ STATE_SCISSORRECT, { STATE_SCISSORRECT, scissorrect }, WINED3D_GL_EXT_NONE },
{ STATE_POINTSPRITECOORDORIGIN, { STATE_POINTSPRITECOORDORIGIN, psorigin }, WINED3D_GL_VERSION_2_0 },
@@ -5063,7 +5070,7 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_SAMPLER(18), /* Vertex sampler 2 */ { STATE_SAMPLER(18), sampler }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(19), /* Vertex sampler 3 */ { STATE_SAMPLER(19), sampler }, WINED3D_GL_EXT_NONE },
{ STATE_BASEVERTEXINDEX, { STATE_BASEVERTEXINDEX, state_nop, }, ARB_DRAW_ELEMENTS_BASE_VERTEX },
- { STATE_BASEVERTEXINDEX, { STATE_VDECL, NULL, }, WINED3D_GL_EXT_NONE },
+ { STATE_BASEVERTEXINDEX, { STATE_STREAMSRC, NULL, }, WINED3D_GL_EXT_NONE },
{0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE },
};
More information about the wine-cvs
mailing list