In order to allow slab allocation from the client thread.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/adapter_vk.c | 13 +++++++++++++ dlls/wined3d/context_vk.c | 30 +++++++++--------------------- dlls/wined3d/wined3d_private.h | 2 +- 3 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index da1302265ca..218b7dc74ba 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -397,6 +397,18 @@ static const struct wined3d_allocator_ops wined3d_allocator_vk_ops = .allocator_destroy_chunk = wined3d_allocator_vk_destroy_chunk, };
+static int wined3d_bo_slab_vk_compare(const void *key, const struct wine_rb_entry *entry) +{ + const struct wined3d_bo_slab_vk *slab = WINE_RB_ENTRY_VALUE(entry, const struct wined3d_bo_slab_vk, entry); + const struct wined3d_bo_slab_vk_key *k = key; + + if (k->memory_type != slab->requested_memory_type) + return k->memory_type - slab->requested_memory_type; + if (k->usage != slab->bo.usage) + return k->usage - slab->bo.usage; + return k->size - slab->bo.size; +} + static HRESULT adapter_vk_create_device(struct wined3d *wined3d, const struct wined3d_adapter *adapter, enum wined3d_device_type device_type, HWND focus_window, unsigned int flags, BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count, @@ -512,6 +524,7 @@ static HRESULT adapter_vk_create_device(struct wined3d *wined3d, const struct wi hr = E_FAIL; goto fail; } + wine_rb_init(&device_vk->bo_slab_available, wined3d_bo_slab_vk_compare);
if (FAILED(hr = wined3d_device_init(&device_vk->d, wined3d, adapter->ordinal, device_type, focus_window, flags, surface_alignment, levels, level_count, vk_info->supported, device_parent))) diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 9854ca70ef0..a6a2ea8a44b 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -359,7 +359,7 @@ static bool wined3d_device_vk_create_slab_bo(struct wined3d_device_vk *device_vk key.usage = usage; key.size = 32 * object_size;
- if ((entry = wine_rb_get(&context_vk->bo_slab_available, &key))) + if ((entry = wine_rb_get(&device_vk->bo_slab_available, &key))) { slab = WINE_RB_ENTRY_VALUE(entry, struct wined3d_bo_slab_vk, entry); TRACE("Using existing bo slab %p.\n", slab); @@ -381,7 +381,7 @@ static bool wined3d_device_vk_create_slab_bo(struct wined3d_device_vk *device_vk } slab->map = ~0u;
- if (wine_rb_put(&context_vk->bo_slab_available, &key, &slab->entry) < 0) + if (wine_rb_put(&device_vk->bo_slab_available, &key, &slab->entry) < 0) { ERR("Failed to add slab to available tree.\n"); wined3d_context_vk_destroy_bo(context_vk, &slab->bo); @@ -397,12 +397,12 @@ static bool wined3d_device_vk_create_slab_bo(struct wined3d_device_vk *device_vk { if (slab->next) { - wine_rb_replace(&context_vk->bo_slab_available, &slab->entry, &slab->next->entry); + wine_rb_replace(&device_vk->bo_slab_available, &slab->entry, &slab->next->entry); slab->next = NULL; } else { - wine_rb_remove(&context_vk->bo_slab_available, &slab->entry); + wine_rb_remove(&device_vk->bo_slab_available, &slab->entry); } }
@@ -705,6 +705,7 @@ void wined3d_context_vk_destroy_allocator_block(struct wined3d_context_vk *conte static void wined3d_bo_slab_vk_free_slice(struct wined3d_bo_slab_vk *slab, SIZE_T idx, struct wined3d_context_vk *context_vk) { + struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device); struct wined3d_bo_slab_vk_key key; struct wine_rb_entry *entry;
@@ -716,12 +717,12 @@ static void wined3d_bo_slab_vk_free_slice(struct wined3d_bo_slab_vk *slab, key.usage = slab->bo.usage; key.size = slab->bo.size;
- if ((entry = wine_rb_get(&context_vk->bo_slab_available, &key))) + if ((entry = wine_rb_get(&device_vk->bo_slab_available, &key))) { slab->next = WINE_RB_ENTRY_VALUE(entry, struct wined3d_bo_slab_vk, entry); - wine_rb_replace(&context_vk->bo_slab_available, entry, &slab->entry); + wine_rb_replace(&device_vk->bo_slab_available, entry, &slab->entry); } - else if (wine_rb_put(&context_vk->bo_slab_available, &key, &slab->entry) < 0) + else if (wine_rb_put(&device_vk->bo_slab_available, &key, &slab->entry) < 0) { ERR("Unable to return slab %p (map 0x%08x) to available tree.\n", slab, slab->map); } @@ -1458,7 +1459,7 @@ void wined3d_context_vk_cleanup(struct wined3d_context_vk *context_vk) wined3d_context_vk_destroy_query_pools(context_vk, &context_vk->free_timestamp_query_pools); wined3d_context_vk_destroy_query_pools(context_vk, &context_vk->free_pipeline_statistics_query_pools); wined3d_context_vk_destroy_query_pools(context_vk, &context_vk->free_stream_output_statistics_query_pools); - wine_rb_destroy(&context_vk->bo_slab_available, wined3d_context_vk_destroy_bo_slab, context_vk); + wine_rb_destroy(&device_vk->bo_slab_available, wined3d_context_vk_destroy_bo_slab, context_vk); heap_free(context_vk->pending_queries.queries); heap_free(context_vk->submitted.buffers); heap_free(context_vk->retired.objects); @@ -1825,18 +1826,6 @@ static int wined3d_graphics_pipeline_vk_compare(const void *key, const struct wi return 0; }
-static int wined3d_bo_slab_vk_compare(const void *key, const struct wine_rb_entry *entry) -{ - const struct wined3d_bo_slab_vk *slab = WINE_RB_ENTRY_VALUE(entry, const struct wined3d_bo_slab_vk, entry); - const struct wined3d_bo_slab_vk_key *k = key; - - if (k->memory_type != slab->requested_memory_type) - return k->memory_type - slab->requested_memory_type; - if (k->usage != slab->bo.usage) - return k->usage - slab->bo.usage; - return k->size - slab->bo.size; -} - static void wined3d_context_vk_init_graphics_pipeline_key(struct wined3d_context_vk *context_vk) { struct wined3d_graphics_pipeline_key_vk *key; @@ -3508,7 +3497,6 @@ HRESULT wined3d_context_vk_init(struct wined3d_context_vk *context_vk, struct wi wine_rb_init(&context_vk->render_passes, wined3d_render_pass_vk_compare); wine_rb_init(&context_vk->pipeline_layouts, wined3d_pipeline_layout_vk_compare); wine_rb_init(&context_vk->graphics_pipelines, wined3d_graphics_pipeline_vk_compare); - wine_rb_init(&context_vk->bo_slab_available, wined3d_bo_slab_vk_compare);
return WINED3D_OK; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b2525110adc..d8b16c0d074 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2622,7 +2622,6 @@ struct wined3d_context_vk struct wine_rb_tree render_passes; struct wine_rb_tree pipeline_layouts; struct wine_rb_tree graphics_pipelines; - struct wine_rb_tree bo_slab_available; };
static inline struct wined3d_context_vk *wined3d_context_vk(struct wined3d_context *context) @@ -4085,6 +4084,7 @@ struct wined3d_device_vk struct wined3d_allocator allocator;
struct wined3d_uav_clear_state_vk uav_clear_state; + struct wine_rb_tree bo_slab_available; };
static inline struct wined3d_device_vk *wined3d_device_vk(struct wined3d_device *device)