Rebase against 9ba058e94c2662f5296c95adeafd29c59b137249.

This commit is contained in:
Sebastian Lackner 2016-06-23 17:37:04 +02:00
parent 1d08851c35
commit 4f12cf4dc9
6 changed files with 37 additions and 234 deletions

View File

@ -51,7 +51,7 @@ usage()
# Get the upstream commit sha
upstream_commit()
{
echo "e3bd659be9b2868b121857fb2643d775bbf0d8c7"
echo "9ba058e94c2662f5296c95adeafd29c59b137249"
}
# Show version information
@ -7449,7 +7449,6 @@ if test "$enable_wined3d_CSMT_Main" -eq 1; then
patch_apply wined3d-CSMT_Main/0112-wined3d-Don-t-discard-new-buffers.patch
patch_apply wined3d-CSMT_Main/0113-wined3d-Don-t-try-to-sync-VBOs-manually-on-OSX-with-.patch
patch_apply wined3d-CSMT_Main/0114-wined3d-Only-discard-buffers-that-are-in-use.patch
patch_apply wined3d-CSMT_Main/0115-wined3d-Destroy-samplers-through-the-command-stream.patch
patch_apply wined3d-CSMT_Main/0116-wined3d-Destroy-shader-resource-views-through-the-CS.patch
patch_apply wined3d-CSMT_Main/0117-wined3d-Send-getdc-and-releasedc-through-the-command.patch
patch_apply wined3d-CSMT_Main/0118-wined3d-Ignore-WINED3D_MAP_NO_DIRTY_UPDATE-in-resour.patch
@ -7584,7 +7583,6 @@ if test "$enable_wined3d_CSMT_Main" -eq 1; then
echo '+ { "Stefan Dösinger", "wined3d: Don'\''t discard new buffers.", 1 },';
echo '+ { "Stefan Dösinger", "wined3d: Don'\''t try to sync VBOs manually on OSX with CSMT.", 1 },';
echo '+ { "Stefan Dösinger", "wined3d: Only discard buffers that are in use.", 1 },';
echo '+ { "Stefan Dösinger", "wined3d: Destroy samplers through the command stream.", 1 },';
echo '+ { "Stefan Dösinger", "wined3d: Destroy shader resource views through the CS.", 1 },';
echo '+ { "Stefan Dösinger", "wined3d: Send getdc and releasedc through the command stream.", 1 },';
echo '+ { "Stefan Dösinger", "wined3d: Ignore WINED3D_MAP_NO_DIRTY_UPDATE in resource_map.", 1 },';

View File

@ -1,4 +1,4 @@
From 914b61d3d8b4a6c680ed6bfe0f3b614a7c32c320 Mon Sep 17 00:00:00 2001
From 9c7a85f85462a459d1a4aad3b97bd0542acc9f83 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20D=C3=B6singer?= <stefan@codeweavers.com>
Date: Wed, 3 Apr 2013 18:01:34 +0200
Subject: wined3d: Wait for the cs before destroying objects
@ -16,10 +16,10 @@ the CS.
6 files changed, 25 insertions(+)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 054c67c..2ae620c 100644
index e851ec9..e99e66d 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -557,6 +557,12 @@ ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer)
@@ -549,6 +549,12 @@ ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer)
if (!refcount)
{
@ -33,10 +33,10 @@ index 054c67c..2ae620c 100644
{
context = context_acquire(buffer->resource.device, NULL);
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index d92ce21..fe96c38 100644
index 3bcbf19..185def9 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -1279,12 +1279,14 @@ static const struct wined3d_cs_ops wined3d_cs_st_ops =
@@ -1322,12 +1322,14 @@ static const struct wined3d_cs_ops wined3d_cs_st_ops =
{
wined3d_cs_st_require_space,
wined3d_cs_st_submit,
@ -52,10 +52,10 @@ index d92ce21..fe96c38 100644
/* FIXME: wined3d_device_uninit_3d() should either flush and wait, or be an
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 0ee045f..21ecdd5 100644
index 05eae08..975a927 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2578,6 +2578,11 @@ ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
@@ -2664,6 +2664,11 @@ ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
if (!refcount)
{
@ -64,14 +64,14 @@ index 0ee045f..21ecdd5 100644
+ FIXME("Waiting for cs.\n");
+ shader->device->cs->ops->finish(shader->device->cs);
+ }
shader_cleanup(shader);
shader->parent_ops->wined3d_object_destroyed(shader->parent);
HeapFree(GetProcessHeap(), 0, shader);
wined3d_cs_emit_destroy_object(shader->device->cs, wined3d_shader_destroy_object, shader);
}
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 708470e..0c7fca1 100644
index cdb7636..ecabc60 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -399,6 +399,12 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture)
@@ -479,6 +479,12 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture)
TRACE("texture %p.\n", texture);
@ -85,10 +85,10 @@ index 708470e..0c7fca1 100644
{
if (!(buffer_object = texture->sub_resources[i].buffer_object))
diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c
index 9eb5907..601a5f5 100644
index c8704e9..fcd637d 100644
--- a/dlls/wined3d/vertexdeclaration.c
+++ b/dlls/wined3d/vertexdeclaration.c
@@ -58,6 +58,11 @@ ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration
@@ -66,6 +66,11 @@ ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration
if (!refcount)
{
@ -97,14 +97,14 @@ index 9eb5907..601a5f5 100644
+ FIXME("Waiting for cs.\n");
+ declaration->device->cs->ops->finish(declaration->device->cs);
+ }
HeapFree(GetProcessHeap(), 0, declaration->elements);
declaration->parent_ops->wined3d_object_destroyed(declaration->parent);
HeapFree(GetProcessHeap(), 0, declaration);
wined3d_cs_emit_destroy_object(declaration->device->cs,
wined3d_vertex_declaration_destroy_object, declaration);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 4e3a326..973c512 100644
index 29f218e..00b4db7 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2879,6 +2879,7 @@ struct wined3d_cs_ops
@@ -2938,6 +2938,7 @@ struct wined3d_cs_ops
{
void *(*require_space)(struct wined3d_cs *cs, size_t size);
void (*submit)(struct wined3d_cs *cs);

View File

@ -1,32 +1,17 @@
From 60b42d6c2c6d5d2ce0dde5925a5873a4a051842e Mon Sep 17 00:00:00 2001
From 8c808d86f613798096da3f113415f2358c63d6bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20D=C3=B6singer?= <stefan@codeweavers.com>
Date: Wed, 31 Jul 2013 23:06:27 +0200
Subject: wined3d: Destroy vertex declarations through the CS
---
dlls/wined3d/vertexdeclaration.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
dlls/wined3d/vertexdeclaration.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c
index 3349f4f..808e092 100644
index fcd637d..c8704e9 100644
--- a/dlls/wined3d/vertexdeclaration.c
+++ b/dlls/wined3d/vertexdeclaration.c
@@ -50,6 +50,14 @@ ULONG CDECL wined3d_vertex_declaration_incref(struct wined3d_vertex_declaration
return refcount;
}
+static void wined3d_vertex_declaration_destroy_object(void *object)
+{
+ struct wined3d_vertex_declaration *declaration = object;
+
+ HeapFree(GetProcessHeap(), 0, declaration->elements);
+ HeapFree(GetProcessHeap(), 0, declaration);
+}
+
ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration *declaration)
{
ULONG refcount = InterlockedDecrement(&declaration->ref);
@@ -58,14 +66,9 @@ ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration
@@ -66,11 +66,6 @@ ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration
if (!refcount)
{
@ -35,14 +20,9 @@ index 3349f4f..808e092 100644
- FIXME("Waiting for cs.\n");
- declaration->device->cs->ops->finish(declaration->device->cs);
- }
- HeapFree(GetProcessHeap(), 0, declaration->elements);
+ const struct wined3d_device *device = declaration->device;
declaration->parent_ops->wined3d_object_destroyed(declaration->parent);
- HeapFree(GetProcessHeap(), 0, declaration);
+ wined3d_cs_emit_destroy_object(device->cs, wined3d_vertex_declaration_destroy_object, declaration);
}
return refcount;
wined3d_cs_emit_destroy_object(declaration->device->cs,
wined3d_vertex_declaration_destroy_object, declaration);
--
2.8.0

View File

@ -1,32 +1,17 @@
From 2bba243cce7043d8cbac3f670d994a032db0fc77 Mon Sep 17 00:00:00 2001
From df9cd44711651586d8aeabd4f4dde47f5bd1801b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20D=C3=B6singer?= <stefan@codeweavers.com>
Date: Wed, 31 Jul 2013 23:18:28 +0200
Subject: wined3d: Destroy shaders through the CS
---
dlls/wined3d/shader.c | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
dlls/wined3d/shader.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 72ea8bc..f5e29b4 100644
index 975a927..05eae08 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2612,6 +2612,14 @@ ULONG CDECL wined3d_shader_incref(struct wined3d_shader *shader)
return refcount;
}
+static void wined3d_shader_destroy_object(void *object)
+{
+ struct wined3d_shader *shader = object;
+
+ shader_cleanup(shader);
+ HeapFree(GetProcessHeap(), 0, shader);
+}
+
ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
{
ULONG refcount = InterlockedDecrement(&shader->ref);
@@ -2620,14 +2628,10 @@ ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
@@ -2664,11 +2664,6 @@ ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
if (!refcount)
{
@ -35,15 +20,9 @@ index 72ea8bc..f5e29b4 100644
- FIXME("Waiting for cs.\n");
- shader->device->cs->ops->finish(shader->device->cs);
- }
- shader_cleanup(shader);
+ const struct wined3d_device *device = shader->device;
+
shader->parent_ops->wined3d_object_destroyed(shader->parent);
- HeapFree(GetProcessHeap(), 0, shader);
+ wined3d_cs_emit_destroy_object(device->cs, wined3d_shader_destroy_object, shader);
wined3d_cs_emit_destroy_object(shader->device->cs, wined3d_shader_destroy_object, shader);
}
return refcount;
--
2.8.0

View File

@ -1,53 +0,0 @@
From 4dc96ab42f9d44017ed6510922c1a324a3e1f2bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20D=C3=B6singer?= <stefan@codeweavers.com>
Date: Thu, 27 Aug 2015 23:43:08 +0200
Subject: wined3d: Destroy samplers through the command stream.
---
dlls/wined3d/sampler.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
index 865198b..8c73466 100644
--- a/dlls/wined3d/sampler.c
+++ b/dlls/wined3d/sampler.c
@@ -33,22 +33,28 @@ ULONG CDECL wined3d_sampler_incref(struct wined3d_sampler *sampler)
return refcount;
}
+static void wined3d_sampler_destroy_object(void *object)
+{
+ struct wined3d_sampler *sampler = object;
+ struct wined3d_context *context = context_acquire(sampler->device, NULL);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
+ GL_EXTCALL(glDeleteSamplers(1, &sampler->name));
+ context_release(context);
+
+ HeapFree(GetProcessHeap(), 0, sampler);
+}
+
ULONG CDECL wined3d_sampler_decref(struct wined3d_sampler *sampler)
{
ULONG refcount = InterlockedDecrement(&sampler->refcount);
- const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
TRACE("%p decreasing refcount to %u.\n", sampler, refcount);
if (!refcount)
{
- context = context_acquire(sampler->device, NULL);
- gl_info = context->gl_info;
- GL_EXTCALL(glDeleteSamplers(1, &sampler->name));
- context_release(context);
-
- HeapFree(GetProcessHeap(), 0, sampler);
+ struct wined3d_device *device = sampler->device;
+ wined3d_cs_emit_destroy_object(device->cs, wined3d_sampler_destroy_object, sampler);
}
return refcount;
--
2.8.0

View File

@ -3844,40 +3844,7 @@ diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
--- a/dlls/wined3d/sampler.c
+++ b/dlls/wined3d/sampler.c
@@ -33,6 +33,7 @@
return refcount;
}
+#if defined(STAGING_CSMT)
static void wined3d_sampler_destroy_object(void *object)
{
struct wined3d_sampler *sampler = object;
@@ -55,6 +56,24 @@
{
struct wined3d_device *device = sampler->device;
wined3d_cs_emit_destroy_object(device->cs, wined3d_sampler_destroy_object, sampler);
+#else /* STAGING_CSMT */
+ULONG CDECL wined3d_sampler_decref(struct wined3d_sampler *sampler)
+{
+ ULONG refcount = InterlockedDecrement(&sampler->refcount);
+ const struct wined3d_gl_info *gl_info;
+ struct wined3d_context *context;
+
+ TRACE("%p decreasing refcount to %u.\n", sampler, refcount);
+
+ if (!refcount)
+ {
+ context = context_acquire(sampler->device, NULL);
+ gl_info = context->gl_info;
+ GL_EXTCALL(glDeleteSamplers(1, &sampler->name));
+ context_release(context);
+
+ HeapFree(GetProcessHeap(), 0, sampler);
+#endif /* STAGING_CSMT */
}
return refcount;
@@ -67,6 +86,7 @@
@@ -66,6 +66,7 @@
return sampler->parent;
}
@ -3885,7 +3852,7 @@ diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
void wined3d_sampler_init(struct wined3d_sampler *sampler)
{
const struct wined3d_gl_info *gl_info;
@@ -98,6 +118,45 @@
@@ -97,6 +98,45 @@
wined3d_gl_compare_func(sampler->desc.comparison_func)));
if ((context->d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)
&& gl_info->supported[EXT_TEXTURE_SRGB_DECODE] && !sampler->desc.srgb_decode)
@ -3931,7 +3898,7 @@ diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
GL_EXTCALL(glSamplerParameteri(sampler->name, GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT));
checkGLcall("sampler creation");
@@ -109,12 +168,14 @@
@@ -108,12 +148,14 @@
HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, struct wined3d_sampler **sampler)
{
@ -3946,7 +3913,7 @@ diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
struct wined3d_sampler *object;
TRACE("device %p, desc %p, parent %p, sampler %p.\n", device, desc, parent, sampler);
@@ -135,6 +196,7 @@
@@ -134,6 +176,7 @@
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
return E_OUTOFMEMORY;
@ -3954,7 +3921,7 @@ diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
object->refcount = 1;
object->device = device;
object->parent = parent;
@@ -143,6 +205,9 @@
@@ -142,6 +185,9 @@
wined3d_sampler_init(object);
else
wined3d_cs_emit_sampler_init(device->cs, object);
@ -3967,40 +3934,7 @@ diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2650,6 +2650,7 @@
return refcount;
}
+#if defined(STAGING_CSMT)
static void wined3d_shader_destroy_object(void *object)
{
struct wined3d_shader *shader = object;
@@ -2658,6 +2659,7 @@
HeapFree(GetProcessHeap(), 0, shader);
}
+#endif /* STAGING_CSMT */
ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
{
ULONG refcount = InterlockedDecrement(&shader->ref);
@@ -2666,10 +2668,16 @@
if (!refcount)
{
+#if defined(STAGING_CSMT)
const struct wined3d_device *device = shader->device;
shader->parent_ops->wined3d_object_destroyed(shader->parent);
wined3d_cs_emit_destroy_object(device->cs, wined3d_shader_destroy_object, shader);
+#else /* STAGING_CSMT */
+ shader_cleanup(shader);
+ shader->parent_ops->wined3d_object_destroyed(shader->parent);
+ HeapFree(GetProcessHeap(), 0, shader);
+#endif /* STAGING_CSMT */
}
return refcount;
@@ -2990,7 +2998,11 @@
@@ -2986,7 +2986,11 @@
UINT i;
memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */
@ -6612,41 +6546,6 @@ diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
if (d3d_info->vs_clipping || !use_vs(state) || !state->render_states[WINED3D_RS_CLIPPING]
|| !state->render_states[WINED3D_RS_CLIPPLANEENABLE])
{
diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c
--- a/dlls/wined3d/vertexdeclaration.c
+++ b/dlls/wined3d/vertexdeclaration.c
@@ -50,6 +50,7 @@
return refcount;
}
+#if defined(STAGING_CSMT)
static void wined3d_vertex_declaration_destroy_object(void *object)
{
struct wined3d_vertex_declaration *declaration = object;
@@ -58,6 +59,7 @@
HeapFree(GetProcessHeap(), 0, declaration);
}
+#endif /* STAGING_CSMT */
ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration *declaration)
{
ULONG refcount = InterlockedDecrement(&declaration->ref);
@@ -66,9 +68,15 @@
if (!refcount)
{
+#if defined(STAGING_CSMT)
const struct wined3d_device *device = declaration->device;
declaration->parent_ops->wined3d_object_destroyed(declaration->parent);
wined3d_cs_emit_destroy_object(device->cs, wined3d_vertex_declaration_destroy_object, declaration);
+#else /* STAGING_CSMT */
+ HeapFree(GetProcessHeap(), 0, declaration->elements);
+ declaration->parent_ops->wined3d_object_destroyed(declaration->parent);
+ HeapFree(GetProcessHeap(), 0, declaration);
+#endif /* STAGING_CSMT */
}
return refcount;
diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c