Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 2 participants
- 84520 discussions
[PATCH vkd3d] vkd3d: Replace descriptor mutexes with atomic operations.
by Conor McCarthy 30 May '22
by Conor McCarthy 30 May '22
30 May '22
Atomic ops can be used if the descriptor struct elements are replaced
with a pointer to an allocated object. SRV, UAV and sampler descriptors
already had view object pointers, so this doesn't affect performance
for them, but CBVs now require dereferencing another (possibly distant)
memory location in addition to the descriptor, which is not great for
memory cache efficiency when copying CBVs. However, the descriptor heap
buffer is now much smaller, and in most cases it's probably a good
tradeoff for removing mutexes.
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
include/private/vkd3d_common.h | 13 +
include/vkd3d_windows.h | 1 +
libs/vkd3d/command.c | 90 ++++---
libs/vkd3d/device.c | 58 ++---
libs/vkd3d/resource.c | 423 +++++++++++++++------------------
libs/vkd3d/vkd3d_private.h | 119 +++++++---
6 files changed, 379 insertions(+), 325 deletions(-)
diff --git a/include/private/vkd3d_common.h b/include/private/vkd3d_common.h
index c041b52d..e4a636c4 100644
--- a/include/private/vkd3d_common.h
+++ b/include/private/vkd3d_common.h
@@ -219,6 +219,10 @@ static inline LONG InterlockedAdd(LONG volatile *x, LONG val)
{
return __sync_add_and_fetch(x, val);
}
+static inline LONG InterlockedCompareExchange(LONG volatile *x, LONG xchg, LONG cmp)
+{
+ return __sync_val_compare_and_swap(x, cmp, xchg);
+}
# else
# error "InterlockedIncrement() not implemented for this platform"
# endif /* HAVE_SYNC_ADD_AND_FETCH */
@@ -231,6 +235,15 @@ static inline LONG InterlockedDecrement(LONG volatile *x)
# else
# error "InterlockedDecrement() not implemented for this platform"
# endif
+
+# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))
+static inline PVOID InterlockedExchangePointer(PVOID volatile *x, PVOID val)
+{
+ return __atomic_exchange_n(x, val, __ATOMIC_SEQ_CST);
+}
+# else
+# error "InterlockedExchangePointer() not implemented for this platform"
+# endif
#endif /* _WIN32 */
static inline void vkd3d_parse_version(const char *version, int *major, int *minor)
diff --git a/include/vkd3d_windows.h b/include/vkd3d_windows.h
index 002ff667..7570113b 100644
--- a/include/vkd3d_windows.h
+++ b/include/vkd3d_windows.h
@@ -103,6 +103,7 @@ typedef unsigned short WCHAR;
typedef wchar_t WCHAR;
# endif /* VKD3D_WIN32_WCHAR */
typedef void *HANDLE;
+typedef void *PVOID;
/* GUID */
# ifdef __WIDL__
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index d0782e5a..2f518af9 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1525,13 +1525,13 @@ static bool d3d12_command_allocator_add_descriptor_pool(struct d3d12_command_all
}
static bool d3d12_command_allocator_add_view(struct d3d12_command_allocator *allocator,
- struct vkd3d_view *view)
+ struct vkd3d_view_desc *view)
{
if (!vkd3d_array_reserve((void **)&allocator->views, &allocator->views_size,
allocator->view_count + 1, sizeof(*allocator->views)))
return false;
- vkd3d_view_incref(view);
+ vkd3d_desc_incref(view);
allocator->views[allocator->view_count++] = view;
return true;
@@ -1718,7 +1718,7 @@ static void d3d12_command_allocator_free_resources(struct d3d12_command_allocato
for (i = 0; i < allocator->view_count; ++i)
{
- vkd3d_view_decref(allocator->views[i], device);
+ vkd3d_view_desc_decref(allocator->views[i], device);
}
allocator->view_count = 0;
@@ -2868,28 +2868,31 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
unsigned int index, bool use_array)
{
uint32_t descriptor_range_magic = range->descriptor_magic;
- const struct vkd3d_view *view = descriptor->u.view_info.view;
+ union d3d12_desc_object u = descriptor->u;
uint32_t vk_binding = range->binding;
+ VkDescriptorType vk_descriptor_type;
uint32_t set = range->set;
- if (descriptor->magic != descriptor_range_magic)
+ if (!u.header || u.header->magic != descriptor_range_magic)
return false;
+ vk_descriptor_type = u.header->vk_descriptor_type;
+
vk_descriptor_write->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
vk_descriptor_write->pNext = NULL;
vk_descriptor_write->dstSet = vk_descriptor_sets[set];
vk_descriptor_write->dstBinding = use_array ? vk_binding : vk_binding + index;
vk_descriptor_write->dstArrayElement = use_array ? index : 0;
vk_descriptor_write->descriptorCount = 1;
- vk_descriptor_write->descriptorType = descriptor->vk_descriptor_type;
+ vk_descriptor_write->descriptorType = vk_descriptor_type;
vk_descriptor_write->pImageInfo = NULL;
vk_descriptor_write->pBufferInfo = NULL;
vk_descriptor_write->pTexelBufferView = NULL;
- switch (descriptor->magic)
+ switch (u.header->magic)
{
case VKD3D_DESCRIPTOR_MAGIC_CBV:
- vk_descriptor_write->pBufferInfo = &descriptor->u.vk_cbv_info;
+ vk_descriptor_write->pBufferInfo = &u.cb_desc->vk_cbv_info;
break;
case VKD3D_DESCRIPTOR_MAGIC_SRV:
@@ -2900,8 +2903,8 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
* in pairs in one set. */
if (range->descriptor_count == UINT_MAX)
{
- if (descriptor->vk_descriptor_type != VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
- && descriptor->vk_descriptor_type != VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
+ if (vk_descriptor_type != VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
+ && vk_descriptor_type != VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
{
vk_descriptor_write->dstSet = vk_descriptor_sets[set + 1];
vk_descriptor_write->dstBinding = 0;
@@ -2911,21 +2914,21 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
{
if (!use_array)
vk_descriptor_write->dstBinding = vk_binding + 2 * index;
- if (descriptor->vk_descriptor_type != VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
- && descriptor->vk_descriptor_type != VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
+ if (vk_descriptor_type != VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
+ && vk_descriptor_type != VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
++vk_descriptor_write->dstBinding;
}
- if (descriptor->vk_descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
- || descriptor->vk_descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
+ if (vk_descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
+ || vk_descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
{
- vk_descriptor_write->pTexelBufferView = &view->u.vk_buffer_view;
+ vk_descriptor_write->pTexelBufferView = &u.view_desc->view.u.vk_buffer_view;
}
else
{
vk_image_info->sampler = VK_NULL_HANDLE;
- vk_image_info->imageView = view->u.vk_image_view;
- vk_image_info->imageLayout = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_SRV
+ vk_image_info->imageView = u.view_desc->view.u.vk_image_view;
+ vk_image_info->imageLayout = u.header->magic == VKD3D_DESCRIPTOR_MAGIC_SRV
? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL;
vk_descriptor_write->pImageInfo = vk_image_info;
@@ -2933,7 +2936,7 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
break;
case VKD3D_DESCRIPTOR_MAGIC_SAMPLER:
- vk_image_info->sampler = view->u.vk_sampler;
+ vk_image_info->sampler = u.view_desc->view.u.vk_sampler;
vk_image_info->imageView = VK_NULL_HANDLE;
vk_image_info->imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
@@ -2941,7 +2944,7 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
break;
default:
- ERR("Invalid descriptor %#x.\n", descriptor->magic);
+ ERR("Invalid descriptor %#x.\n", u.header->magic);
return false;
}
@@ -2996,6 +2999,11 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
for (j = 0; j < descriptor_count; ++j, ++descriptor)
{
unsigned int register_idx = range->base_register_idx + j;
+ union d3d12_desc_object u = descriptor->u;
+ VkBufferView vk_counter_view;
+
+ vk_counter_view = (u.header && u.header->magic == VKD3D_DESCRIPTOR_MAGIC_UAV)
+ ? u.view_desc->view.vk_counter_view : VK_NULL_HANDLE;
/* Track UAV counters. */
if (range->descriptor_magic == VKD3D_DESCRIPTOR_MAGIC_UAV)
@@ -3005,8 +3013,6 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
if (state->uav_counters.bindings[k].register_space == range->register_space
&& state->uav_counters.bindings[k].register_index == register_idx)
{
- VkBufferView vk_counter_view = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_UAV
- ? descriptor->u.view_info.view->vk_counter_view : VK_NULL_HANDLE;
if (bindings->vk_uav_counter_views[k] != vk_counter_view)
bindings->uav_counters_dirty = true;
bindings->vk_uav_counter_views[k] = vk_counter_view;
@@ -3016,7 +3022,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
}
/* Not all descriptors are necessarily populated if the range is unbounded. */
- if (descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_FREE)
+ if (!u.header)
continue;
if (!vk_write_descriptor_set_from_d3d12_desc(current_descriptor_write, current_image_info,
@@ -4956,8 +4962,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList2(iface);
const struct d3d12_rtv_desc *rtv_desc;
const struct d3d12_dsv_desc *dsv_desc;
+ struct vkd3d_view_desc *view;
VkFormat prev_dsv_format;
- struct vkd3d_view *view;
unsigned int i;
TRACE("iface %p, render_target_descriptor_count %u, render_target_descriptors %p, "
@@ -5003,7 +5009,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
WARN("Failed to add view.\n");
}
- list->rtvs[i] = view->u.vk_image_view;
+ list->rtvs[i] = view->view.u.vk_image_view;
list->fb_width = max(list->fb_width, rtv_desc->width);
list->fb_height = max(list->fb_height, rtv_desc->height);
list->fb_layer_count = max(list->fb_layer_count, rtv_desc->layer_count);
@@ -5027,7 +5033,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
list->dsv = VK_NULL_HANDLE;
}
- list->dsv = view->u.vk_image_view;
+ list->dsv = view->view.u.vk_image_view;
list->fb_width = max(list->fb_width, dsv_desc->width);
list->fb_height = max(list->fb_height, dsv_desc->height);
list->fb_layer_count = max(list->fb_layer_count, dsv_desc->layer_count);
@@ -5049,7 +5055,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
static void d3d12_command_list_clear(struct d3d12_command_list *list,
const struct VkAttachmentDescription *attachment_desc,
const struct VkAttachmentReference *color_reference, const struct VkAttachmentReference *ds_reference,
- struct vkd3d_view *view, size_t width, size_t height, unsigned int layer_count,
+ struct vkd3d_view_desc *view, size_t width, size_t height, unsigned int layer_count,
const union VkClearValue *clear_value, unsigned int rect_count, const D3D12_RECT *rects)
{
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
@@ -5119,7 +5125,7 @@ static void d3d12_command_list_clear(struct d3d12_command_list *list,
fb_desc.flags = 0;
fb_desc.renderPass = vk_render_pass;
fb_desc.attachmentCount = 1;
- fb_desc.pAttachments = &view->u.vk_image_view;
+ fb_desc.pAttachments = &view->view.u.vk_image_view;
fb_desc.width = width;
fb_desc.height = height;
fb_desc.layers = layer_count;
@@ -5322,7 +5328,7 @@ static void vkd3d_uav_clear_state_get_image_pipeline(const struct vkd3d_uav_clea
}
static void d3d12_command_list_clear_uav(struct d3d12_command_list *list,
- struct d3d12_resource *resource, struct vkd3d_view *view, const VkClearColorValue *clear_colour,
+ struct d3d12_resource *resource, struct vkd3d_view_desc *view_desc, const VkClearColorValue *clear_colour,
unsigned int rect_count, const D3D12_RECT *rects)
{
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
@@ -5332,6 +5338,7 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list,
VkDescriptorImageInfo image_info;
D3D12_RECT full_rect, curr_rect;
VkWriteDescriptorSet write_set;
+ const struct vkd3d_view *view;
d3d12_command_list_track_resource_usage(list, resource);
d3d12_command_list_end_current_render_pass(list);
@@ -5340,8 +5347,9 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list,
d3d12_command_list_invalidate_bindings(list, list->state);
d3d12_command_list_invalidate_root_parameters(list, VKD3D_PIPELINE_BIND_POINT_COMPUTE);
- if (!d3d12_command_allocator_add_view(list->allocator, view))
+ if (!d3d12_command_allocator_add_view(list->allocator, view_desc))
WARN("Failed to add view.\n");
+ view = &view_desc->view;
clear_args.colour = *clear_colour;
@@ -5454,18 +5462,21 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
const UINT values[4], UINT rect_count, const D3D12_RECT *rects)
{
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList2(iface);
+ struct vkd3d_view_desc *descriptor, *uint_view = NULL;
struct d3d12_device *device = list->device;
- struct vkd3d_view *view, *uint_view = NULL;
struct vkd3d_texture_view_desc view_desc;
const struct vkd3d_format *uint_format;
struct d3d12_resource *resource_impl;
+ const struct vkd3d_view *view;
VkClearColorValue colour;
TRACE("iface %p, gpu_handle %#"PRIx64", cpu_handle %lx, resource %p, values %p, rect_count %u, rects %p.\n",
iface, gpu_handle.ptr, cpu_handle.ptr, resource, values, rect_count, rects);
resource_impl = unsafe_impl_from_ID3D12Resource(resource);
- view = d3d12_desc_from_cpu_handle(cpu_handle)->u.view_info.view;
+ if (!(descriptor = d3d12_desc_from_cpu_handle(cpu_handle)->u.view_desc))
+ return;
+ view = &descriptor->view;
memcpy(colour.uint32, values, sizeof(colour.uint32));
if (view->format->type != VKD3D_FORMAT_TYPE_UINT)
@@ -5479,8 +5490,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
if (d3d12_resource_is_buffer(resource_impl))
{
- if (!vkd3d_create_buffer_view(device, resource_impl->u.vk_buffer, uint_format,
- view->info.buffer.offset, view->info.buffer.size, &uint_view))
+ if (!vkd3d_create_buffer_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_UAV, resource_impl->u.vk_buffer,
+ uint_format, view->info.buffer.offset, view->info.buffer.size, &uint_view))
{
ERR("Failed to create buffer view.\n");
return;
@@ -5496,19 +5507,19 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
view_desc.layer_idx = view->info.texture.layer_idx;
view_desc.layer_count = view->info.texture.layer_count;
- if (!vkd3d_create_texture_view(device, resource_impl->u.vk_image, &view_desc, &uint_view))
+ if (!vkd3d_create_texture_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_UAV, resource_impl->u.vk_image, &view_desc, &uint_view))
{
ERR("Failed to create image view.\n");
return;
}
}
- view = uint_view;
+ descriptor = uint_view;
}
- d3d12_command_list_clear_uav(list, resource_impl, view, &colour, rect_count, rects);
+ d3d12_command_list_clear_uav(list, resource_impl, descriptor, &colour, rect_count, rects);
if (uint_view)
- vkd3d_view_decref(uint_view, device);
+ vkd3d_view_desc_decref(uint_view, device);
}
static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(ID3D12GraphicsCommandList2 *iface,
@@ -5517,14 +5528,15 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(I
{
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList2(iface);
struct d3d12_resource *resource_impl;
+ struct vkd3d_view_desc *view;
VkClearColorValue colour;
- struct vkd3d_view *view;
TRACE("iface %p, gpu_handle %#"PRIx64", cpu_handle %lx, resource %p, values %p, rect_count %u, rects %p.\n",
iface, gpu_handle.ptr, cpu_handle.ptr, resource, values, rect_count, rects);
resource_impl = unsafe_impl_from_ID3D12Resource(resource);
- view = d3d12_desc_from_cpu_handle(cpu_handle)->u.view_info.view;
+ if (!(view = d3d12_desc_from_cpu_handle(cpu_handle)->u.view_desc))
+ return;
memcpy(colour.float32, values, sizeof(colour.float32));
d3d12_command_list_clear_uav(list, resource_impl, view, &colour, rect_count, rects);
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index eaedc444..7b56e033 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -2575,6 +2575,25 @@ static void vkd3d_init_descriptor_pool_sizes(VkDescriptorPoolSize *pool_sizes,
VKD3D_MAX_VIRTUAL_HEAP_DESCRIPTORS_PER_TYPE);
};
+static void vkd3d_desc_object_cache_init(struct vkd3d_desc_object_cache *cache)
+{
+ vkd3d_mutex_init(&cache->mutex);
+ cache->cache = NULL;
+ cache->capacity = 0;
+ cache->count = 0;
+ cache->reserve = 0;
+}
+
+static void vkd3d_desc_object_cache_cleanup(struct vkd3d_desc_object_cache *cache)
+{
+ size_t i;
+
+ vkd3d_mutex_destroy(&cache->mutex);
+ for (i = 0; i < cache->count; ++i)
+ vkd3d_free(cache->cache[i]);
+ vkd3d_free(cache->cache);
+}
+
/* ID3D12Device */
static inline struct d3d12_device *impl_from_ID3D12Device(ID3D12Device *iface)
{
@@ -2615,7 +2634,6 @@ static ULONG STDMETHODCALLTYPE d3d12_device_Release(ID3D12Device *iface)
{
struct d3d12_device *device = impl_from_ID3D12Device(iface);
ULONG refcount = InterlockedDecrement(&device->refcount);
- size_t i;
TRACE("%p decreasing refcount to %u.\n", device, refcount);
@@ -2634,8 +2652,8 @@ static ULONG STDMETHODCALLTYPE d3d12_device_Release(ID3D12Device *iface)
vkd3d_render_pass_cache_cleanup(&device->render_pass_cache, device);
d3d12_device_destroy_pipeline_cache(device);
d3d12_device_destroy_vkd3d_queues(device);
- for (i = 0; i < ARRAY_SIZE(device->desc_mutex); ++i)
- vkd3d_mutex_destroy(&device->desc_mutex[i]);
+ vkd3d_desc_object_cache_cleanup(&device->view_desc_cache);
+ vkd3d_desc_object_cache_cleanup(&device->cbuffer_desc_cache);
VK_CALL(vkDestroyDevice(device->vk_device, NULL));
if (device->parent)
IUnknown_Release(device->parent);
@@ -3548,32 +3566,20 @@ static void d3d12_desc_buffered_copy_atomic(struct d3d12_desc *dst, const struct
{
struct d3d12_desc_copy_location *location;
enum vkd3d_vk_descriptor_set_index set;
- struct vkd3d_mutex *mutex;
+ union d3d12_desc_object src_u;
- mutex = d3d12_device_get_descriptor_mutex(device, src);
- vkd3d_mutex_lock(mutex);
-
- if (src->magic == VKD3D_DESCRIPTOR_MAGIC_FREE)
+ if (!(src_u.object = d3d12_desc_get_object_ref(src, device)))
{
- /* Source must be unlocked first, and therefore can't be used as a null source. */
- static const struct d3d12_desc null = {0};
- vkd3d_mutex_unlock(mutex);
- d3d12_desc_write_atomic(dst, &null, device);
+ d3d12_desc_destroy(dst, device);
return;
}
- set = vkd3d_vk_descriptor_set_index_from_vk_descriptor_type(src->vk_descriptor_type);
+ set = vkd3d_vk_descriptor_set_index_from_vk_descriptor_type(src_u.header->vk_descriptor_type);
location = &locations[set][infos[set].count++];
+ location->src = src_u;
- location->src = *src;
-
- if (location->src.magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
- vkd3d_view_incref(location->src.u.view_info.view);
-
- vkd3d_mutex_unlock(mutex);
-
- infos[set].uav_counter |= (location->src.magic == VKD3D_DESCRIPTOR_MAGIC_UAV)
- && !!location->src.u.view_info.view->vk_counter_view;
+ infos[set].uav_counter |= (src_u.header->magic == VKD3D_DESCRIPTOR_MAGIC_UAV)
+ && !!src_u.view_desc->view.vk_counter_view;
location->dst = dst;
if (infos[set].count == ARRAY_SIZE(locations[0]))
@@ -3633,8 +3639,7 @@ static void d3d12_device_vk_heaps_copy_descriptors(struct d3d12_device *device,
* mutex is only intended to prevent use-after-free of the vkd3d_view caused by a
* race condition in the calling app. It is unnecessary to protect this test as it's
* the app's race condition, not ours. */
- if (dst[dst_idx].magic == src[src_idx].magic && (dst[dst_idx].magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
- && dst[dst_idx].u.view_info.written_serial_id == src[src_idx].u.view_info.view->serial_id)
+ if (dst[dst_idx].u.object == src[src_idx].u.object)
continue;
d3d12_desc_buffered_copy_atomic(&dst[dst_idx], &src[src_idx], locations, infos, descriptor_heap, device);
}
@@ -4242,7 +4247,6 @@ static HRESULT d3d12_device_init(struct d3d12_device *device,
{
const struct vkd3d_vk_device_procs *vk_procs;
HRESULT hr;
- size_t i;
device->ID3D12Device_iface.lpVtbl = &d3d12_device_vtbl;
device->refcount = 1;
@@ -4285,8 +4289,8 @@ static HRESULT d3d12_device_init(struct d3d12_device *device,
device->blocked_queue_count = 0;
- for (i = 0; i < ARRAY_SIZE(device->desc_mutex); ++i)
- vkd3d_mutex_init(&device->desc_mutex[i]);
+ vkd3d_desc_object_cache_init(&device->view_desc_cache);
+ vkd3d_desc_object_cache_init(&device->cbuffer_desc_cache);
vkd3d_init_descriptor_pool_sizes(device->vk_pool_sizes, &device->vk_info.descriptor_limits);
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 68c28cd1..cb465fea 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2078,57 +2078,128 @@ ULONG vkd3d_resource_decref(ID3D12Resource *resource)
return d3d12_resource_decref(impl_from_ID3D12Resource(resource));
}
-/* CBVs, SRVs, UAVs */
-static struct vkd3d_view *vkd3d_view_create(enum vkd3d_view_type type)
+/* Objects are cached so that vkd3d_desc_incref() can safely check the refcount
+ * of an object freed by another thread. */
+static void *vkd3d_desc_object_cache_get(struct vkd3d_desc_object_cache *cache, size_t size)
{
- struct vkd3d_view *view;
+ void *object = NULL;
- if ((view = vkd3d_malloc(sizeof(*view))))
+ vkd3d_mutex_lock(&cache->mutex);
+
+ if (cache->count)
+ {
+ object = cache->cache[--cache->count];
+ }
+ else
+ {
+ object = vkd3d_malloc(size);
+ ++cache->reserve;
+ }
+
+ vkd3d_mutex_unlock(&cache->mutex);
+ return object;
+}
+
+static void vkd3d_desc_object_cache_put(struct vkd3d_desc_object_cache *cache, void *object)
+{
+ vkd3d_mutex_lock(&cache->mutex);
+
+ if (!vkd3d_array_reserve((void **)&cache->cache, &cache->capacity, max(cache->count + 1, cache->reserve),
+ sizeof(*cache->cache)))
+ {
+ ERR("Failed to allocate cache.\n");
+ vkd3d_free(object);
+ return;
+ }
+ else
{
- view->refcount = 1;
- view->type = type;
- view->serial_id = InterlockedIncrement64(&object_global_serial_id);
- view->vk_counter_view = VK_NULL_HANDLE;
+ cache->cache[cache->count++] = object;
}
- return view;
+
+ vkd3d_mutex_unlock(&cache->mutex);
}
-void vkd3d_view_incref(struct vkd3d_view *view)
+static struct vkd3d_cbuffer_desc *vkd3d_cbuffer_desc_create(struct d3d12_device *device)
{
- InterlockedIncrement(&view->refcount);
+ struct vkd3d_cbuffer_desc *desc;
+
+ if (!(desc = vkd3d_desc_object_cache_get(&device->cbuffer_desc_cache, sizeof(*desc))))
+ return NULL;
+
+ desc->h.magic = VKD3D_DESCRIPTOR_MAGIC_CBV;
+ desc->h.vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ desc->h.refcount = 1;
+
+ return desc;
}
-static void vkd3d_view_destroy(struct vkd3d_view *view, struct d3d12_device *device)
+static struct vkd3d_view_desc *vkd3d_view_desc_create(uint32_t magic, VkDescriptorType vk_descriptor_type,
+ enum vkd3d_view_type type, struct d3d12_device *device)
+{
+ struct vkd3d_view_desc *desc;
+
+ if (!(desc = vkd3d_desc_object_cache_get(&device->view_desc_cache, sizeof(*desc))))
+ {
+ ERR("Failed to allocate descriptor object.\n");
+ return NULL;
+ }
+
+ desc->h.magic = magic;
+ desc->h.vk_descriptor_type = vk_descriptor_type;
+ desc->h.refcount = 1;
+ desc->view.type = type;
+ desc->view.vk_counter_view = VK_NULL_HANDLE;
+
+ return desc;
+}
+
+static void vkd3d_view_desc_destroy(struct vkd3d_view_desc *view, struct d3d12_device *device)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
TRACE("Destroying view %p.\n", view);
- switch (view->type)
+ switch (view->view.type)
{
case VKD3D_VIEW_TYPE_BUFFER:
- VK_CALL(vkDestroyBufferView(device->vk_device, view->u.vk_buffer_view, NULL));
+ VK_CALL(vkDestroyBufferView(device->vk_device, view->view.u.vk_buffer_view, NULL));
break;
case VKD3D_VIEW_TYPE_IMAGE:
- VK_CALL(vkDestroyImageView(device->vk_device, view->u.vk_image_view, NULL));
+ VK_CALL(vkDestroyImageView(device->vk_device, view->view.u.vk_image_view, NULL));
break;
case VKD3D_VIEW_TYPE_SAMPLER:
- VK_CALL(vkDestroySampler(device->vk_device, view->u.vk_sampler, NULL));
+ VK_CALL(vkDestroySampler(device->vk_device, view->view.u.vk_sampler, NULL));
break;
default:
- WARN("Unhandled view type %d.\n", view->type);
+ WARN("Unhandled view type %d.\n", view->view.type);
}
- if (view->vk_counter_view)
- VK_CALL(vkDestroyBufferView(device->vk_device, view->vk_counter_view, NULL));
+ if (view->view.vk_counter_view)
+ VK_CALL(vkDestroyBufferView(device->vk_device, view->view.vk_counter_view, NULL));
- vkd3d_free(view);
+ vkd3d_desc_object_cache_put(&device->view_desc_cache, view);
}
-void vkd3d_view_decref(struct vkd3d_view *view, struct d3d12_device *device)
+void vkd3d_view_desc_decref(struct vkd3d_view_desc *view, struct d3d12_device *device)
{
- if (!InterlockedDecrement(&view->refcount))
- vkd3d_view_destroy(view, device);
+ if (!InterlockedDecrement(&view->h.refcount))
+ vkd3d_view_desc_destroy(view, device);
+}
+
+void d3d12_desc_replace(struct d3d12_desc *dst, void *desc, struct d3d12_device *device)
+{
+ union d3d12_desc_object u;
+
+ if (!(u.object = InterlockedExchangePointer(&dst->u.object, desc)))
+ return;
+
+ if (InterlockedDecrement(&u.header->refcount))
+ return;
+
+ if (u.header->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
+ vkd3d_view_desc_destroy(u.view_desc, device);
+ else
+ vkd3d_desc_object_cache_put(&device->cbuffer_desc_cache, u.object);
}
/* TODO: write null descriptors to all applicable sets (invalid behaviour workaround). */
@@ -2137,14 +2208,14 @@ static void d3d12_descriptor_heap_write_vk_descriptor_range(struct d3d12_descrip
{
unsigned int i, info_index = 0, write_index = 0;
- switch (locations[0].src.vk_descriptor_type)
+ switch (locations[0].src.header->vk_descriptor_type)
{
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
for (; write_index < write_count; ++write_index)
{
descriptor_set->vk_descriptor_writes[write_index].pBufferInfo = &descriptor_set->vk_buffer_infos[info_index];
for (i = 0; i < descriptor_set->vk_descriptor_writes[write_index].descriptorCount; ++i, ++info_index)
- descriptor_set->vk_buffer_infos[info_index] = locations[info_index].src.u.vk_cbv_info;
+ descriptor_set->vk_buffer_infos[info_index] = locations[info_index].src.cb_desc->vk_cbv_info;
}
break;
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
@@ -2153,7 +2224,7 @@ static void d3d12_descriptor_heap_write_vk_descriptor_range(struct d3d12_descrip
{
descriptor_set->vk_descriptor_writes[write_index].pImageInfo = &descriptor_set->vk_image_infos[info_index];
for (i = 0; i < descriptor_set->vk_descriptor_writes[write_index].descriptorCount; ++i, ++info_index)
- descriptor_set->vk_image_infos[info_index].imageView = locations[info_index].src.u.view_info.view->u.vk_image_view;
+ descriptor_set->vk_image_infos[info_index].imageView = locations[info_index].src.view_desc->view.u.vk_image_view;
}
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
@@ -2162,7 +2233,7 @@ static void d3d12_descriptor_heap_write_vk_descriptor_range(struct d3d12_descrip
{
descriptor_set->vk_descriptor_writes[write_index].pTexelBufferView = &descriptor_set->vk_buffer_views[info_index];
for (i = 0; i < descriptor_set->vk_descriptor_writes[write_index].descriptorCount; ++i, ++info_index)
- descriptor_set->vk_buffer_views[info_index] = locations[info_index].src.u.view_info.view->u.vk_buffer_view;
+ descriptor_set->vk_buffer_views[info_index] = locations[info_index].src.view_desc->view.u.vk_buffer_view;
}
break;
case VK_DESCRIPTOR_TYPE_SAMPLER:
@@ -2170,11 +2241,11 @@ static void d3d12_descriptor_heap_write_vk_descriptor_range(struct d3d12_descrip
{
descriptor_set->vk_descriptor_writes[write_index].pImageInfo = &descriptor_set->vk_image_infos[info_index];
for (i = 0; i < descriptor_set->vk_descriptor_writes[write_index].descriptorCount; ++i, ++info_index)
- descriptor_set->vk_image_infos[info_index].sampler = locations[info_index].src.u.view_info.view->u.vk_sampler;
+ descriptor_set->vk_image_infos[info_index].sampler = locations[info_index].src.view_desc->view.u.vk_sampler;
}
break;
default:
- ERR("Unhandled descriptor type %#x.\n", locations[0].src.vk_descriptor_type);
+ ERR("Unhandled descriptor type %#x.\n", locations[0].src.header->vk_descriptor_type);
break;
}
}
@@ -2220,46 +2291,45 @@ static void d3d12_desc_write_vk_heap_null_descriptor(struct d3d12_descriptor_hea
}
}
-/* dst and src contain the same data unless another thread overwrites dst. The array index is
- * calculated from dst, and src is thread safe. */
-static void d3d12_desc_write_vk_heap(const struct d3d12_desc *dst, const struct d3d12_desc *src,
- struct d3d12_device *device)
+void d3d12_desc_write_vk_heap(const struct d3d12_desc *src, void *object, struct d3d12_device *device)
{
struct d3d12_descriptor_heap_vk_set *descriptor_set;
struct d3d12_descriptor_heap *descriptor_heap;
const struct vkd3d_vk_device_procs *vk_procs;
+ union d3d12_desc_object u;
bool is_null = false;
- descriptor_heap = vkd3d_gpu_descriptor_allocator_heap_from_descriptor(&device->gpu_descriptor_allocator, dst);
+ u.object = object;
+ descriptor_heap = vkd3d_gpu_descriptor_allocator_heap_from_descriptor(&device->gpu_descriptor_allocator, src);
descriptor_set = &descriptor_heap->vk_descriptor_sets[vkd3d_vk_descriptor_set_index_from_vk_descriptor_type(
- src->vk_descriptor_type)];
+ u.header->vk_descriptor_type)];
vk_procs = &device->vk_procs;
vkd3d_mutex_lock(&descriptor_heap->vk_sets_mutex);
- descriptor_set->vk_descriptor_writes[0].dstArrayElement = dst
+ descriptor_set->vk_descriptor_writes[0].dstArrayElement = src
- (const struct d3d12_desc *)descriptor_heap->descriptors;
descriptor_set->vk_descriptor_writes[0].descriptorCount = 1;
- switch (src->vk_descriptor_type)
+ switch (u.header->vk_descriptor_type)
{
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
- descriptor_set->vk_descriptor_writes[0].pBufferInfo = &src->u.vk_cbv_info;
- is_null = !src->u.vk_cbv_info.buffer;
+ descriptor_set->vk_descriptor_writes[0].pBufferInfo = &u.cb_desc->vk_cbv_info;
+ is_null = !u.cb_desc->vk_cbv_info.buffer;
break;
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
- is_null = !(descriptor_set->vk_image_infos[0].imageView = src->u.view_info.view->u.vk_image_view);
+ is_null = !(descriptor_set->vk_image_infos[0].imageView = u.view_desc->view.u.vk_image_view);
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
- descriptor_set->vk_descriptor_writes[0].pTexelBufferView = &src->u.view_info.view->u.vk_buffer_view;
- is_null = !src->u.view_info.view->u.vk_buffer_view;
+ descriptor_set->vk_descriptor_writes[0].pTexelBufferView = &u.view_desc->view.u.vk_buffer_view;
+ is_null = !u.view_desc->view.u.vk_buffer_view;
break;
case VK_DESCRIPTOR_TYPE_SAMPLER:
- descriptor_set->vk_image_infos[0].sampler = src->u.view_info.view->u.vk_sampler;
+ descriptor_set->vk_image_infos[0].sampler = u.view_desc->view.u.vk_sampler;
break;
default:
- ERR("Unhandled descriptor type %#x.\n", src->vk_descriptor_type);
+ ERR("Unhandled descriptor type %#x.\n", u.header->vk_descriptor_type);
break;
}
if (is_null && device->vk_info.EXT_robustness2)
@@ -2272,75 +2342,19 @@ static void d3d12_desc_write_vk_heap(const struct d3d12_desc *dst, const struct
VK_CALL(vkUpdateDescriptorSets(device->vk_device, 1, descriptor_set->vk_descriptor_writes, 0, NULL));
- if (src->magic == VKD3D_DESCRIPTOR_MAGIC_UAV && src->u.view_info.view->vk_counter_view)
+ if (u.header->magic == VKD3D_DESCRIPTOR_MAGIC_UAV && u.view_desc->view.vk_counter_view)
{
descriptor_set = &descriptor_heap->vk_descriptor_sets[VKD3D_SET_INDEX_UAV_COUNTER];
- descriptor_set->vk_descriptor_writes[0].dstArrayElement = dst
+ descriptor_set->vk_descriptor_writes[0].dstArrayElement = src
- (const struct d3d12_desc *)descriptor_heap->descriptors;
descriptor_set->vk_descriptor_writes[0].descriptorCount = 1;
- descriptor_set->vk_descriptor_writes[0].pTexelBufferView = &src->u.view_info.view->vk_counter_view;
+ descriptor_set->vk_descriptor_writes[0].pTexelBufferView = &u.view_desc->view.vk_counter_view;
VK_CALL(vkUpdateDescriptorSets(device->vk_device, 1, descriptor_set->vk_descriptor_writes, 0, NULL));
}
vkd3d_mutex_unlock(&descriptor_heap->vk_sets_mutex);
}
-static void d3d12_desc_write_atomic_d3d12_only(struct d3d12_desc *dst, const struct d3d12_desc *src, struct d3d12_device *device)
-{
- struct vkd3d_view *defunct_view;
- struct vkd3d_mutex *mutex;
-
- mutex = d3d12_device_get_descriptor_mutex(device, dst);
- vkd3d_mutex_lock(mutex);
-
- if (!(dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW) || InterlockedDecrement(&dst->u.view_info.view->refcount))
- {
- *dst = *src;
- vkd3d_mutex_unlock(mutex);
- return;
- }
-
- defunct_view = dst->u.view_info.view;
- *dst = *src;
- vkd3d_mutex_unlock(mutex);
-
- /* Destroy the view after unlocking to reduce wait time. */
- vkd3d_view_destroy(defunct_view, device);
-}
-
-void d3d12_desc_write_atomic(struct d3d12_desc *dst, const struct d3d12_desc *src,
- struct d3d12_device *device)
-{
- struct vkd3d_view *defunct_view = NULL;
- struct vkd3d_mutex *mutex;
-
- mutex = d3d12_device_get_descriptor_mutex(device, dst);
- vkd3d_mutex_lock(mutex);
-
- /* Nothing to do for VKD3D_DESCRIPTOR_MAGIC_CBV. */
- if ((dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
- && !InterlockedDecrement(&dst->u.view_info.view->refcount))
- defunct_view = dst->u.view_info.view;
-
- *dst = *src;
-
- vkd3d_mutex_unlock(mutex);
-
- /* Destroy the view after unlocking to reduce wait time. */
- if (defunct_view)
- vkd3d_view_destroy(defunct_view, device);
-
- if (device->use_vk_heaps && dst->magic)
- d3d12_desc_write_vk_heap(dst, src, device);
-}
-
-static void d3d12_desc_destroy(struct d3d12_desc *descriptor, struct d3d12_device *device)
-{
- static const struct d3d12_desc null_desc = {0};
-
- d3d12_desc_write_atomic(descriptor, &null_desc, device);
-}
-
void d3d12_desc_copy_vk_heap_range(struct d3d12_desc_copy_location *locations, const struct d3d12_desc_copy_info *info,
struct d3d12_descriptor_heap *descriptor_heap, enum vkd3d_vk_descriptor_set_index set,
struct d3d12_device *device)
@@ -2353,7 +2367,7 @@ void d3d12_desc_copy_vk_heap_range(struct d3d12_desc_copy_location *locations, c
for (i = 0, write_count = 0; i < info->count; ++i)
{
- d3d12_desc_write_atomic_d3d12_only(locations[i].dst, &locations[i].src, device);
+ d3d12_desc_replace(locations[i].dst, locations[i].src.object, device);
if (i && locations[i].dst == locations[i - 1].dst + 1)
{
@@ -2377,9 +2391,11 @@ void d3d12_desc_copy_vk_heap_range(struct d3d12_desc_copy_location *locations, c
for (i = 0, write_count = 0; i < info->count; ++i)
{
- if (!locations[i].src.u.view_info.view->vk_counter_view)
+ VkBufferView vk_counter_view;
+
+ if (!(vk_counter_view = locations[i].src.view_desc->view.vk_counter_view))
continue;
- descriptor_set->vk_buffer_views[write_count] = locations[i].src.u.view_info.view->vk_counter_view;
+ descriptor_set->vk_buffer_views[write_count] = vk_counter_view;
descriptor_set->vk_descriptor_writes[write_count].pTexelBufferView = &descriptor_set->vk_buffer_views[write_count];
descriptor_set->vk_descriptor_writes[write_count].dstArrayElement = locations[i].dst
- (const struct d3d12_desc *)descriptor_heap->descriptors;
@@ -2395,22 +2411,14 @@ void d3d12_desc_copy(struct d3d12_desc *dst, const struct d3d12_desc *src,
struct d3d12_device *device)
{
struct d3d12_desc tmp;
- struct vkd3d_mutex *mutex;
assert(dst != src);
- /* Shadow of the Tomb Raider and possibly other titles sometimes destroy
- * and rewrite a descriptor in another thread while it is being copied. */
- mutex = d3d12_device_get_descriptor_mutex(device, src);
- vkd3d_mutex_lock(mutex);
-
- if (src->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
- vkd3d_view_incref(src->u.view_info.view);
-
- tmp = *src;
-
- vkd3d_mutex_unlock(mutex);
-
+ /* Shadow of the Tomb Raider and possibly other titles sometimes copy a
+ * descriptor to the same location concurrently in multiple threads. It
+ * doesn't seem to copy from a location while destroying it in another
+ * thread, but we handle this too. */
+ tmp.u.object = d3d12_desc_get_object_ref(src, device);
d3d12_desc_write_atomic(dst, &tmp, device);
}
@@ -2472,36 +2480,39 @@ static bool vkd3d_create_vk_buffer_view(struct d3d12_device *device,
return vr == VK_SUCCESS;
}
-bool vkd3d_create_buffer_view(struct d3d12_device *device, VkBuffer vk_buffer, const struct vkd3d_format *format,
- VkDeviceSize offset, VkDeviceSize size, struct vkd3d_view **view)
+bool vkd3d_create_buffer_view_desc(struct d3d12_device *device, uint32_t magic, VkBuffer vk_buffer,
+ const struct vkd3d_format *format, VkDeviceSize offset, VkDeviceSize size,
+ struct vkd3d_view_desc **view_desc)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkBufferView vk_view = VK_NULL_HANDLE;
- struct vkd3d_view *object;
+ struct vkd3d_view_desc *object;
if (vk_buffer && !vkd3d_create_vk_buffer_view(device, vk_buffer, format, offset, size, &vk_view))
return false;
- if (!(object = vkd3d_view_create(VKD3D_VIEW_TYPE_BUFFER)))
+ if (!(object = vkd3d_view_desc_create(magic, magic == VKD3D_DESCRIPTOR_MAGIC_UAV
+ ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
+ VKD3D_VIEW_TYPE_BUFFER, device)))
{
VK_CALL(vkDestroyBufferView(device->vk_device, vk_view, NULL));
return false;
}
- object->u.vk_buffer_view = vk_view;
- object->format = format;
- object->info.buffer.offset = offset;
- object->info.buffer.size = size;
- *view = object;
+ object->view.u.vk_buffer_view = vk_view;
+ object->view.format = format;
+ object->view.info.buffer.offset = offset;
+ object->view.info.buffer.size = size;
+ *view_desc = object;
return true;
}
#define VKD3D_VIEW_RAW_BUFFER 0x1
static bool vkd3d_create_buffer_view_for_resource(struct d3d12_device *device,
- struct d3d12_resource *resource, DXGI_FORMAT view_format,
+ uint32_t magic, struct d3d12_resource *resource, DXGI_FORMAT view_format,
unsigned int offset, unsigned int size, unsigned int structure_stride,
- unsigned int flags, struct vkd3d_view **view)
+ unsigned int flags, struct vkd3d_view_desc **view_desc)
{
const struct vkd3d_format *format;
VkDeviceSize element_size;
@@ -2530,8 +2541,8 @@ static bool vkd3d_create_buffer_view_for_resource(struct d3d12_device *device,
assert(d3d12_resource_is_buffer(resource));
- return vkd3d_create_buffer_view(device, resource->u.vk_buffer,
- format, offset * element_size, size * element_size, view);
+ return vkd3d_create_buffer_view_desc(device, magic, resource->u.vk_buffer,
+ format, offset * element_size, size * element_size, view_desc);
}
static void vkd3d_set_view_swizzle_for_format(VkComponentMapping *components,
@@ -2758,14 +2769,14 @@ static void vkd3d_texture_view_desc_normalise(struct vkd3d_texture_view_desc *de
desc->layer_count = max_layer_count;
}
-bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
- const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view)
+bool vkd3d_create_texture_view_desc(struct d3d12_device *device, uint32_t magic, VkImage vk_image,
+ const struct vkd3d_texture_view_desc *desc, struct vkd3d_view_desc **view)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
const struct vkd3d_format *format = desc->format;
struct VkImageViewCreateInfo view_desc;
VkImageView vk_view = VK_NULL_HANDLE;
- struct vkd3d_view *object;
+ struct vkd3d_view_desc *object;
VkResult vr;
if (vk_image)
@@ -2791,18 +2802,19 @@ bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
}
}
- if (!(object = vkd3d_view_create(VKD3D_VIEW_TYPE_IMAGE)))
+ if (!(object = vkd3d_view_desc_create(magic, magic == VKD3D_DESCRIPTOR_MAGIC_UAV ? VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
+ : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VKD3D_VIEW_TYPE_IMAGE, device)))
{
VK_CALL(vkDestroyImageView(device->vk_device, vk_view, NULL));
return false;
}
- object->u.vk_image_view = vk_view;
- object->format = format;
- object->info.texture.vk_view_type = desc->view_type;
- object->info.texture.miplevel_idx = desc->miplevel_idx;
- object->info.texture.layer_idx = desc->layer_idx;
- object->info.texture.layer_count = desc->layer_count;
+ object->view.u.vk_image_view = vk_view;
+ object->view.format = format;
+ object->view.info.texture.vk_view_type = desc->view_type;
+ object->view.info.texture.miplevel_idx = desc->miplevel_idx;
+ object->view.info.texture.layer_idx = desc->layer_idx;
+ object->view.info.texture.layer_count = desc->layer_count;
*view = object;
return true;
}
@@ -2811,6 +2823,7 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
struct d3d12_device *device, const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc)
{
struct VkDescriptorBufferInfo *buffer_info;
+ struct vkd3d_cbuffer_desc *cb_desc;
struct d3d12_resource *resource;
if (!desc)
@@ -2819,13 +2832,19 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
return;
}
+ if (!(cb_desc = vkd3d_cbuffer_desc_create(device)))
+ {
+ ERR("Failed to allocate descriptor object.\n");
+ return;
+ }
+
if (desc->SizeInBytes & (D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT - 1))
{
WARN("Size is not %u bytes aligned.\n", D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
return;
}
- buffer_info = &descriptor->u.vk_cbv_info;
+ buffer_info = &cb_desc->vk_cbv_info;
if (desc->BufferLocation)
{
resource = vkd3d_gpu_va_allocator_dereference(&device->gpu_va_allocator, desc->BufferLocation);
@@ -2841,8 +2860,7 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
buffer_info->range = VK_WHOLE_SIZE;
}
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_CBV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptor->u.cb_desc = cb_desc;
}
static unsigned int vkd3d_view_flags_from_d3d12_buffer_srv_flags(D3D12_BUFFER_SRV_FLAGS flags)
@@ -2859,7 +2877,6 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
{
struct vkd3d_null_resources *null_resources = &device->null_resources;
struct vkd3d_texture_view_desc vkd3d_desc;
- struct vkd3d_view *view;
VkImage vk_image;
if (!desc)
@@ -2874,15 +2891,9 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
if (!device->vk_info.EXT_robustness2)
WARN("Creating NULL buffer SRV %#x.\n", desc->Format);
- if (vkd3d_create_buffer_view(device, null_resources->vk_buffer,
+ vkd3d_create_buffer_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_SRV, null_resources->vk_buffer,
vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false),
- 0, VKD3D_NULL_BUFFER_SIZE, &view))
- {
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
- }
+ 0, VKD3D_NULL_BUFFER_SIZE, &descriptor->u.view_desc);
return;
case D3D12_SRV_DIMENSION_TEXTURE2D:
@@ -2920,20 +2931,13 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
vkd3d_desc.components.a = VK_COMPONENT_SWIZZLE_ZERO;
vkd3d_desc.allowed_swizzle = true;
- if (!vkd3d_create_texture_view(device, vk_image, &vkd3d_desc, &view))
- return;
-
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
+ vkd3d_create_texture_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_SRV, vk_image, &vkd3d_desc, &descriptor->u.view_desc);
}
static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_SHADER_RESOURCE_VIEW_DESC *desc)
{
- struct vkd3d_view *view;
unsigned int flags;
if (!desc)
@@ -2949,15 +2953,9 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
}
flags = vkd3d_view_flags_from_d3d12_buffer_srv_flags(desc->u.Buffer.Flags);
- if (!vkd3d_create_buffer_view_for_resource(device, resource, desc->Format,
+ vkd3d_create_buffer_view_for_resource(device, VKD3D_DESCRIPTOR_MAGIC_SRV, resource, desc->Format,
desc->u.Buffer.FirstElement, desc->u.Buffer.NumElements,
- desc->u.Buffer.StructureByteStride, flags, &view))
- return;
-
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
+ desc->u.Buffer.StructureByteStride, flags, &descriptor->u.view_desc);
}
static VkImageAspectFlags vk_image_aspect_flags_from_d3d12_plane_slice(const struct vkd3d_format *format,
@@ -2986,7 +2984,6 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
const D3D12_SHADER_RESOURCE_VIEW_DESC *desc)
{
struct vkd3d_texture_view_desc vkd3d_desc;
- struct vkd3d_view *view;
if (!resource)
{
@@ -3082,13 +3079,8 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
}
}
- if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view))
- return;
-
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
+ vkd3d_create_texture_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_SRV, resource->u.vk_image, &vkd3d_desc,
+ &descriptor->u.view_desc);
}
static unsigned int vkd3d_view_flags_from_d3d12_buffer_uav_flags(D3D12_BUFFER_UAV_FLAGS flags)
@@ -3105,7 +3097,6 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
{
struct vkd3d_null_resources *null_resources = &device->null_resources;
struct vkd3d_texture_view_desc vkd3d_desc;
- struct vkd3d_view *view;
VkImage vk_image;
if (!desc)
@@ -3120,15 +3111,9 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
if (!device->vk_info.EXT_robustness2)
WARN("Creating NULL buffer UAV %#x.\n", desc->Format);
- if (vkd3d_create_buffer_view(device, null_resources->vk_storage_buffer,
+ vkd3d_create_buffer_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_UAV, null_resources->vk_storage_buffer,
vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false),
- 0, VKD3D_NULL_BUFFER_SIZE, &view))
- {
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
- }
+ 0, VKD3D_NULL_BUFFER_SIZE, &descriptor->u.view_desc);
return;
case D3D12_UAV_DIMENSION_TEXTURE2D:
@@ -3166,20 +3151,14 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
vkd3d_desc.components.a = VK_COMPONENT_SWIZZLE_A;
vkd3d_desc.allowed_swizzle = false;
- if (!vkd3d_create_texture_view(device, vk_image, &vkd3d_desc, &view))
- return;
-
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
+ vkd3d_create_texture_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_UAV, vk_image, &vkd3d_desc, &descriptor->u.view_desc);
}
static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_device *device,
struct d3d12_resource *resource, struct d3d12_resource *counter_resource,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc)
{
- struct vkd3d_view *view;
+ struct vkd3d_view_desc *view_desc;
unsigned int flags;
if (!desc)
@@ -3195,16 +3174,11 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
}
flags = vkd3d_view_flags_from_d3d12_buffer_uav_flags(desc->u.Buffer.Flags);
- if (!vkd3d_create_buffer_view_for_resource(device, resource, desc->Format,
+ if (!vkd3d_create_buffer_view_for_resource(device, VKD3D_DESCRIPTOR_MAGIC_UAV, resource, desc->Format,
desc->u.Buffer.FirstElement, desc->u.Buffer.NumElements,
- desc->u.Buffer.StructureByteStride, flags, &view))
+ desc->u.Buffer.StructureByteStride, flags, &view_desc))
return;
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
-
if (counter_resource)
{
const struct vkd3d_format *format;
@@ -3214,13 +3188,16 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
if (!vkd3d_create_vk_buffer_view(device, counter_resource->u.vk_buffer, format,
- desc->u.Buffer.CounterOffsetInBytes, sizeof(uint32_t), &view->vk_counter_view))
+ desc->u.Buffer.CounterOffsetInBytes, sizeof(uint32_t), &view_desc->view.vk_counter_view))
{
WARN("Failed to create counter buffer view.\n");
- view->vk_counter_view = VK_NULL_HANDLE;
- d3d12_desc_destroy(descriptor, device);
+ view_desc->view.vk_counter_view = VK_NULL_HANDLE;
+ vkd3d_view_desc_decref(view_desc, device);
+ return;
}
}
+
+ descriptor->u.view_desc = view_desc;
}
static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
@@ -3228,7 +3205,6 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc)
{
struct vkd3d_texture_view_desc vkd3d_desc;
- struct vkd3d_view *view;
if (!init_default_texture_view_desc(&vkd3d_desc, resource, desc ? desc->Format : 0))
return;
@@ -3273,13 +3249,8 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
}
}
- if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view))
- return;
-
- descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
- descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
- descriptor->u.view_info.view = view;
- descriptor->u.view_info.written_serial_id = view->serial_id;
+ vkd3d_create_texture_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_UAV, resource->u.vk_image, &vkd3d_desc,
+ &descriptor->u.view_desc);
}
void d3d12_desc_create_uav(struct d3d12_desc *descriptor, struct d3d12_device *device,
@@ -3414,7 +3385,7 @@ static VkResult d3d12_create_sampler(struct d3d12_device *device, D3D12_FILTER f
void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
struct d3d12_device *device, const D3D12_SAMPLER_DESC *desc)
{
- struct vkd3d_view *view;
+ struct vkd3d_view_desc *view_desc;
if (!desc)
{
@@ -3428,21 +3399,19 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
FIXME("Ignoring border color {%.8e, %.8e, %.8e, %.8e}.\n",
desc->BorderColor[0], desc->BorderColor[1], desc->BorderColor[2], desc->BorderColor[3]);
- if (!(view = vkd3d_view_create(VKD3D_VIEW_TYPE_SAMPLER)))
+ if (!(view_desc = vkd3d_view_desc_create(VKD3D_DESCRIPTOR_MAGIC_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLER,
+ VKD3D_VIEW_TYPE_SAMPLER, device)))
return;
if (d3d12_create_sampler(device, desc->Filter, desc->AddressU,
desc->AddressV, desc->AddressW, desc->MipLODBias, desc->MaxAnisotropy,
- desc->ComparisonFunc, desc->MinLOD, desc->MaxLOD, &view->u.vk_sampler) < 0)
+ desc->ComparisonFunc, desc->MinLOD, desc->MaxLOD, &view_desc->view.u.vk_sampler) < 0)
{
- vkd3d_free(view);
+ vkd3d_free(view_desc);
return;
}
- sampler->magic = VKD3D_DESCRIPTOR_MAGIC_SAMPLER;
- sampler->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLER;
- sampler->u.view_info.view = view;
- sampler->u.view_info.written_serial_id = view->serial_id;
+ sampler->u.view_desc = view_desc;
}
HRESULT vkd3d_create_static_sampler(struct d3d12_device *device,
@@ -3467,7 +3436,7 @@ static void d3d12_rtv_desc_destroy(struct d3d12_rtv_desc *rtv, struct d3d12_devi
if (rtv->magic != VKD3D_DESCRIPTOR_MAGIC_RTV)
return;
- vkd3d_view_decref(rtv->view, device);
+ vkd3d_view_desc_decref(rtv->view, device);
memset(rtv, 0, sizeof(*rtv));
}
@@ -3475,7 +3444,7 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
struct d3d12_resource *resource, const D3D12_RENDER_TARGET_VIEW_DESC *desc)
{
struct vkd3d_texture_view_desc vkd3d_desc;
- struct vkd3d_view *view;
+ struct vkd3d_view_desc *view;
d3d12_rtv_desc_destroy(rtv_desc, device);
@@ -3543,7 +3512,7 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
assert(d3d12_resource_is_texture(resource));
- if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view))
+ if (!vkd3d_create_texture_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_RTV, resource->u.vk_image, &vkd3d_desc, &view))
return;
rtv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_RTV;
@@ -3562,7 +3531,7 @@ static void d3d12_dsv_desc_destroy(struct d3d12_dsv_desc *dsv, struct d3d12_devi
if (dsv->magic != VKD3D_DESCRIPTOR_MAGIC_DSV)
return;
- vkd3d_view_decref(dsv->view, device);
+ vkd3d_view_desc_decref(dsv->view, device);
memset(dsv, 0, sizeof(*dsv));
}
@@ -3570,7 +3539,7 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
struct d3d12_resource *resource, const D3D12_DEPTH_STENCIL_VIEW_DESC *desc)
{
struct vkd3d_texture_view_desc vkd3d_desc;
- struct vkd3d_view *view;
+ struct vkd3d_view_desc *view;
d3d12_dsv_desc_destroy(dsv_desc, device);
@@ -3628,7 +3597,7 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
assert(d3d12_resource_is_texture(resource));
- if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view))
+ if (!vkd3d_create_texture_view_desc(device, VKD3D_DESCRIPTOR_MAGIC_DSV, resource->u.vk_image, &vkd3d_desc, &view))
return;
dsv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_DSV;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index f00181a2..6df777ca 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -660,9 +660,7 @@ enum vkd3d_view_type
struct vkd3d_view
{
- LONG refcount;
enum vkd3d_view_type type;
- uint64_t serial_id;
union
{
VkBufferView vk_buffer_view;
@@ -688,9 +686,6 @@ struct vkd3d_view
} info;
};
-void vkd3d_view_decref(struct vkd3d_view *view, struct d3d12_device *device);
-void vkd3d_view_incref(struct vkd3d_view *view);
-
struct vkd3d_texture_view_desc
{
VkImageViewType view_type;
@@ -704,28 +699,79 @@ struct vkd3d_texture_view_desc
bool allowed_swizzle;
};
-bool vkd3d_create_buffer_view(struct d3d12_device *device, VkBuffer vk_buffer, const struct vkd3d_format *format,
- VkDeviceSize offset, VkDeviceSize size, struct vkd3d_view **view);
-bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
- const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view);
+struct vkd3d_desc_header
+{
+ uint32_t magic;
+ LONG refcount;
+ VkDescriptorType vk_descriptor_type;
+};
+
+struct vkd3d_view_desc
+{
+ struct vkd3d_desc_header h;
+ struct vkd3d_view view;
+};
-struct vkd3d_view_info
+struct vkd3d_cbuffer_desc
{
- uint64_t written_serial_id;
- struct vkd3d_view *view;
+ struct vkd3d_desc_header h;
+ VkDescriptorBufferInfo vk_cbv_info;
};
struct d3d12_desc
{
- uint32_t magic;
- VkDescriptorType vk_descriptor_type;
- union
+ union d3d12_desc_object
{
- VkDescriptorBufferInfo vk_cbv_info;
- struct vkd3d_view_info view_info;
+ struct vkd3d_desc_header *header;
+ struct vkd3d_view_desc *view_desc;
+ struct vkd3d_cbuffer_desc *cb_desc;
+ void *object;
} u;
};
+bool vkd3d_create_buffer_view_desc(struct d3d12_device *device, uint32_t magic, VkBuffer vk_buffer,
+ const struct vkd3d_format *format, VkDeviceSize offset, VkDeviceSize size,
+ struct vkd3d_view_desc **view_desc);
+bool vkd3d_create_texture_view_desc(struct d3d12_device *device, uint32_t magic, VkImage vk_image,
+ const struct vkd3d_texture_view_desc *desc, struct vkd3d_view_desc **view);
+
+void vkd3d_view_desc_decref(struct vkd3d_view_desc *view_desc, struct d3d12_device *device);
+void d3d12_desc_replace(struct d3d12_desc *dst, void *desc, struct d3d12_device *device);
+
+static inline bool vkd3d_desc_incref(void *desc)
+{
+ struct vkd3d_desc_header *h = desc;
+ LONG refcount;
+
+ do
+ {
+ refcount = h->refcount;
+ /* Avoid incrementing a freed object. Reading the value is safe because objects are recycled. */
+ if (refcount <= 0)
+ return false;
+ }
+ while (InterlockedCompareExchange(&h->refcount, refcount + 1, refcount) != refcount);
+
+ return true;
+}
+
+static inline void *d3d12_desc_get_object_ref(const volatile struct d3d12_desc *src, struct d3d12_device *device)
+{
+ void *desc;
+
+ do
+ {
+ desc = src->u.object;
+ } while (desc && !vkd3d_desc_incref(desc));
+
+ return desc;
+}
+
+static inline void d3d12_desc_destroy(struct d3d12_desc *descriptor, struct d3d12_device *device)
+{
+ d3d12_desc_replace(descriptor, NULL, device);
+}
+
static inline struct d3d12_desc *d3d12_desc_from_cpu_handle(D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle)
{
return (struct d3d12_desc *)cpu_handle.ptr;
@@ -746,7 +792,7 @@ void d3d12_desc_create_uav(struct d3d12_desc *descriptor, struct d3d12_device *d
struct d3d12_resource *resource, struct d3d12_resource *counter_resource,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc);
void d3d12_desc_create_sampler(struct d3d12_desc *sampler, struct d3d12_device *device, const D3D12_SAMPLER_DESC *desc);
-void d3d12_desc_write_atomic(struct d3d12_desc *dst, const struct d3d12_desc *src, struct d3d12_device *device);
+void d3d12_desc_write_vk_heap(const struct d3d12_desc *src, void *object, struct d3d12_device *device);
bool vkd3d_create_raw_buffer_view(struct d3d12_device *device,
D3D12_GPU_VIRTUAL_ADDRESS gpu_address, VkBufferView *vk_buffer_view);
@@ -761,7 +807,7 @@ struct d3d12_rtv_desc
uint64_t width;
unsigned int height;
unsigned int layer_count;
- struct vkd3d_view *view;
+ struct vkd3d_view_desc *view;
struct d3d12_resource *resource;
};
@@ -781,7 +827,7 @@ struct d3d12_dsv_desc
uint64_t width;
unsigned int height;
unsigned int layer_count;
- struct vkd3d_view *view;
+ struct vkd3d_view_desc *view;
struct d3d12_resource *resource;
};
@@ -861,7 +907,7 @@ HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
struct d3d12_desc_copy_location
{
- struct d3d12_desc src;
+ union d3d12_desc_object src;
struct d3d12_desc *dst;
};
@@ -1156,7 +1202,7 @@ struct d3d12_command_allocator
size_t descriptor_pools_size;
size_t descriptor_pool_count;
- struct vkd3d_view **views;
+ struct vkd3d_view_desc **views;
size_t views_size;
size_t view_count;
@@ -1450,6 +1496,15 @@ struct vkd3d_uav_clear_state
HRESULT vkd3d_uav_clear_state_init(struct vkd3d_uav_clear_state *state, struct d3d12_device *device);
void vkd3d_uav_clear_state_cleanup(struct vkd3d_uav_clear_state *state, struct d3d12_device *device);
+struct vkd3d_desc_object_cache
+{
+ struct vkd3d_mutex mutex;
+ void **cache;
+ size_t capacity;
+ size_t count;
+ size_t reserve;
+};
+
#define VKD3D_DESCRIPTOR_POOL_COUNT 6
/* ID3D12Device */
@@ -1468,7 +1523,8 @@ struct d3d12_device
struct vkd3d_gpu_va_allocator gpu_va_allocator;
struct vkd3d_mutex mutex;
- struct vkd3d_mutex desc_mutex[8];
+ struct vkd3d_desc_object_cache view_desc_cache;
+ struct vkd3d_desc_object_cache cbuffer_desc_cache;
struct vkd3d_render_pass_cache render_pass_cache;
VkPipelineCache vk_pipeline_cache;
@@ -1542,17 +1598,16 @@ static inline unsigned int d3d12_device_get_descriptor_handle_increment_size(str
return ID3D12Device_GetDescriptorHandleIncrementSize(&device->ID3D12Device_iface, descriptor_type);
}
-static inline struct vkd3d_mutex *d3d12_device_get_descriptor_mutex(struct d3d12_device *device,
- const struct d3d12_desc *descriptor)
+static inline void d3d12_desc_write_atomic(struct d3d12_desc *dst, const struct d3d12_desc *src,
+ struct d3d12_device *device)
{
- STATIC_ASSERT(!(ARRAY_SIZE(device->desc_mutex) & (ARRAY_SIZE(device->desc_mutex) - 1)));
- uintptr_t idx = (uintptr_t)descriptor;
-
- idx ^= idx >> 12;
- idx ^= idx >> 6;
- idx ^= idx >> 3;
+ void *object = src->u.object;
- return &device->desc_mutex[idx & (ARRAY_SIZE(device->desc_mutex) - 1)];
+ /* Write the Vulkan descriptor first. Otherwise, while it's unlikely the dst
+ * and src would be destroyed before the write occurs, it is possible. */
+ if (device->use_vk_heaps && object)
+ d3d12_desc_write_vk_heap(dst, object, device);
+ d3d12_desc_replace(dst, object, device);
}
/* utils */
--
2.36.1
1
0
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mscms/handle.c | 16 +++--
dlls/mscms/profile.c | 166 ++++++++++++++++---------------------------
2 files changed, 72 insertions(+), 110 deletions(-)
diff --git a/dlls/mscms/handle.c b/dlls/mscms/handle.c
index bd6851b8a37..2ff71464e59 100644
--- a/dlls/mscms/handle.c
+++ b/dlls/mscms/handle.c
@@ -49,11 +49,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(mscms);
void free_handle_tables( void )
{
- HeapFree( GetProcessHeap(), 0, profiletable );
+ free( profiletable );
profiletable = NULL;
num_profile_handles = 0;
- HeapFree( GetProcessHeap(), 0, transformtable );
+ free( transformtable );
transformtable = NULL;
num_transform_handles = 0;
@@ -112,12 +112,13 @@ static HPROFILE alloc_profile_handle( void )
}
if (!profiletable)
{
- p = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, count * sizeof(struct profile) );
+ p = calloc( count, sizeof(*p) );
}
else
{
count = num_profile_handles * 2;
- p = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, profiletable, count * sizeof(struct profile) );
+ p = realloc( profiletable, count * sizeof(*p) );
+ if (p) memset( p + num_profile_handles, 0, num_profile_handles * sizeof(*p) );
}
if (!p) return NULL;
@@ -173,7 +174,7 @@ BOOL close_profile( HPROFILE handle )
CloseHandle( profile->file );
}
if (profile->cmsprofile) cmsCloseProfile( profile->cmsprofile );
- HeapFree( GetProcessHeap(), 0, profile->data );
+ free( profile->data );
memset( profile, 0, sizeof(struct profile) );
@@ -193,12 +194,13 @@ static HTRANSFORM alloc_transform_handle( void )
}
if (!transformtable)
{
- p = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, count * sizeof(*p) );
+ p = calloc( count, sizeof(*p) );
}
else
{
count = num_transform_handles * 2;
- p = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, transformtable, count * sizeof(*p) );
+ p = realloc( transformtable, count * sizeof(*p) );
+ if (p) memset( p + num_transform_handles, 0, num_transform_handles * sizeof(*p) );
}
if (!p) return NULL;
diff --git a/dlls/mscms/profile.c b/dlls/mscms/profile.c
index 2c20b857a81..b23ad5bbe10 100644
--- a/dlls/mscms/profile.c
+++ b/dlls/mscms/profile.c
@@ -19,6 +19,7 @@
*/
#include <stdarg.h>
+#include <stdlib.h>
#include "windef.h"
#include "winbase.h"
@@ -32,22 +33,20 @@
#include "mscms_priv.h"
-static void basename( LPCWSTR path, LPWSTR name )
+static void basename( const WCHAR *path, WCHAR *name )
{
- INT i = lstrlenW( path );
-
+ int i = lstrlenW( path );
while (i > 0 && path[i - 1] != '\\' && path[i - 1] != '/') i--;
lstrcpyW( name, &path[i] );
}
-static inline LPWSTR strdupW( LPCSTR str )
+static inline WCHAR *strdupW( const char *str )
{
- LPWSTR ret = NULL;
+ WCHAR *ret = NULL;
if (str)
{
- DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
- if ((ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
- MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
+ int len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
+ if ((ret = malloc( len * sizeof(WCHAR) ))) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
}
return ret;
}
@@ -83,19 +82,19 @@ BOOL WINAPI AssociateColorProfileWithDeviceA( PCSTR machine, PCSTR profile, PCST
}
len = MultiByteToWideChar( CP_ACP, 0, profile, -1, NULL, 0 );
- if (!(profileW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return FALSE;
+ if (!(profileW = malloc( len * sizeof(WCHAR) ))) return FALSE;
MultiByteToWideChar( CP_ACP, 0, profile, -1, profileW, len );
len = MultiByteToWideChar( CP_ACP, 0, device, -1, NULL, 0 );
- if ((deviceW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
+ if ((deviceW = malloc( len * sizeof(WCHAR) )))
{
MultiByteToWideChar( CP_ACP, 0, device, -1, deviceW, len );
ret = AssociateColorProfileWithDeviceW( NULL, profileW, deviceW );
}
- HeapFree( GetProcessHeap(), 0, profileW );
- HeapFree( GetProcessHeap(), 0, deviceW );
+ free( profileW );
+ free( deviceW );
return ret;
}
@@ -187,19 +186,19 @@ BOOL WINAPI DisassociateColorProfileFromDeviceA( PCSTR machine, PCSTR profile, P
}
len = MultiByteToWideChar( CP_ACP, 0, profile, -1, NULL, 0 );
- if (!(profileW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return FALSE;
+ if (!(profileW = malloc( len * sizeof(WCHAR) ))) return FALSE;
MultiByteToWideChar( CP_ACP, 0, profile, -1, profileW, len );
len = MultiByteToWideChar( CP_ACP, 0, device, -1, NULL, 0 );
- if ((deviceW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
+ if ((deviceW = malloc( len * sizeof(WCHAR) )))
{
MultiByteToWideChar( CP_ACP, 0, device, -1, deviceW, len );
ret = DisassociateColorProfileFromDeviceW( NULL, profileW, deviceW );
}
- HeapFree( GetProcessHeap(), 0, profileW );
- HeapFree( GetProcessHeap(), 0, deviceW );
+ free( profileW );
+ free( deviceW );
return ret;
}
@@ -249,8 +248,7 @@ BOOL WINAPI GetColorDirectoryA( PCSTR machine, PSTR buffer, PDWORD size )
sizeW = *size * sizeof(WCHAR);
- bufferW = HeapAlloc( GetProcessHeap(), 0, sizeW );
- if (bufferW)
+ if ((bufferW = malloc( sizeW )))
{
if ((ret = GetColorDirectoryW( NULL, bufferW, &sizeW )))
{
@@ -259,8 +257,7 @@ BOOL WINAPI GetColorDirectoryA( PCSTR machine, PSTR buffer, PDWORD size )
if (!len) ret = FALSE;
}
else *size = sizeW / sizeof(WCHAR);
-
- HeapFree( GetProcessHeap(), 0, bufferW );
+ free( bufferW );
}
return ret;
}
@@ -530,8 +527,7 @@ BOOL WINAPI GetStandardColorSpaceProfileA( PCSTR machine, DWORD id, PSTR profile
return ret;
}
- profileW = HeapAlloc( GetProcessHeap(), 0, sizeW );
- if (profileW)
+ if ((profileW = malloc( sizeW )))
{
if ((ret = GetStandardColorSpaceProfileW( NULL, id, profileW, &sizeW )))
{
@@ -540,8 +536,7 @@ BOOL WINAPI GetStandardColorSpaceProfileA( PCSTR machine, DWORD id, PSTR profile
if (!len) ret = FALSE;
}
else *size = sizeW / sizeof(WCHAR);
-
- HeapFree( GetProcessHeap(), 0, profileW );
+ free( profileW );
}
return ret;
}
@@ -780,8 +775,7 @@ BOOL WINAPI EnumColorProfilesA( PCSTR machine, PENUMTYPEA record, PBYTE buffer,
find = FindFirstFileA( glob, &data );
if (find == INVALID_HANDLE_VALUE) return FALSE;
- profiles = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(char *) + 1 );
- if (!profiles) goto exit;
+ if (!(profiles = calloc( 1, sizeof(char *) + 1 ))) goto exit;
memcpy( &recordW, record, sizeof(ENUMTYPEA) );
if (record->pDeviceName)
@@ -790,19 +784,14 @@ BOOL WINAPI EnumColorProfilesA( PCSTR machine, PENUMTYPEA record, PBYTE buffer,
if (!(recordW.pDeviceName = deviceW)) goto exit;
}
- fileW = strdupW( data.cFileName );
- if (!fileW) goto exit;
+ if (!(fileW = strdupW( data.cFileName ))) goto exit;
- ret = header_from_file( fileW, &header );
- if (ret)
+ if ((ret = header_from_file( fileW, &header )))
{
- match = match_profile( &recordW, &header );
- if (match)
+ if ((match = match_profile( &recordW, &header )))
{
len = sizeof(char) * (lstrlenA( data.cFileName ) + 1);
- profiles[count] = HeapAlloc( GetProcessHeap(), 0, len );
-
- if (!profiles[count]) goto exit;
+ if (!(profiles[count] = malloc( len ))) goto exit;
else
{
TRACE( "matching profile: %s\n", debugstr_a(data.cFileName) );
@@ -812,33 +801,26 @@ BOOL WINAPI EnumColorProfilesA( PCSTR machine, PENUMTYPEA record, PBYTE buffer,
}
}
}
- HeapFree( GetProcessHeap(), 0, fileW );
+ free( fileW );
fileW = NULL;
while (FindNextFileA( find, &data ))
{
- fileW = strdupW( data.cFileName );
- if (!fileW) goto exit;
-
- ret = header_from_file( fileW, &header );
- if (!ret)
+ if (!(fileW = strdupW( data.cFileName ))) goto exit;
+ if (!(ret = header_from_file( fileW, &header )))
{
- HeapFree( GetProcessHeap(), 0, fileW );
+ free( fileW );
continue;
}
- match = match_profile( &recordW, &header );
- if (match)
+ if ((match = match_profile( &recordW, &header )))
{
- char **tmp = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- profiles, sizeof(char *) * (count + 1) );
+ char **tmp = realloc( profiles, sizeof(char *) * (count + 1) );
if (!tmp) goto exit;
else profiles = tmp;
len = sizeof(char) * (lstrlenA( data.cFileName ) + 1);
- profiles[count] = HeapAlloc( GetProcessHeap(), 0, len );
-
- if (!profiles[count]) goto exit;
+ if (!(profiles[count] = malloc( len ))) goto exit;
else
{
TRACE( "matching profile: %s\n", debugstr_a(data.cFileName) );
@@ -847,7 +829,7 @@ BOOL WINAPI EnumColorProfilesA( PCSTR machine, PENUMTYPEA record, PBYTE buffer,
count++;
}
}
- HeapFree( GetProcessHeap(), 0, fileW );
+ free( fileW );
fileW = NULL;
}
@@ -874,11 +856,10 @@ BOOL WINAPI EnumColorProfilesA( PCSTR machine, PENUMTYPEA record, PBYTE buffer,
if (number) *number = count;
exit:
- for (i = 0; i < count; i++)
- HeapFree( GetProcessHeap(), 0, profiles[i] );
- HeapFree( GetProcessHeap(), 0, profiles );
- HeapFree( GetProcessHeap(), 0, deviceW );
- HeapFree( GetProcessHeap(), 0, fileW );
+ for (i = 0; i < count; i++) free( profiles[i] );
+ free( profiles );
+ free( deviceW );
+ free( fileW );
FindClose( find );
return ret;
@@ -930,19 +911,14 @@ BOOL WINAPI EnumColorProfilesW( PCWSTR machine, PENUMTYPEW record, PBYTE buffer,
find = FindFirstFileW( glob, &data );
if (find == INVALID_HANDLE_VALUE) return FALSE;
- profiles = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR *) + 1 );
- if (!profiles) goto exit;
+ if (!(profiles = calloc( 1, sizeof(WCHAR *) + 1 ))) goto exit;
- ret = header_from_file( data.cFileName, &header );
- if (ret)
+ if ((ret = header_from_file( data.cFileName, &header )))
{
- match = match_profile( record, &header );
- if (match)
+ if ((match = match_profile( record, &header )))
{
len = sizeof(WCHAR) * (lstrlenW( data.cFileName ) + 1);
- profiles[count] = HeapAlloc( GetProcessHeap(), 0, len );
-
- if (!profiles[count]) goto exit;
+ if (!(profiles[count] = malloc( len ))) goto exit;
else
{
TRACE( "matching profile: %s\n", debugstr_w(data.cFileName) );
@@ -955,21 +931,16 @@ BOOL WINAPI EnumColorProfilesW( PCWSTR machine, PENUMTYPEW record, PBYTE buffer,
while (FindNextFileW( find, &data ))
{
- ret = header_from_file( data.cFileName, &header );
- if (!ret) continue;
+ if (!(ret = header_from_file( data.cFileName, &header ))) continue;
- match = match_profile( record, &header );
- if (match)
+ if ((match = match_profile( record, &header )))
{
- WCHAR **tmp = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- profiles, sizeof(WCHAR *) * (count + 1) );
+ WCHAR **tmp = realloc( profiles, sizeof(WCHAR *) * (count + 1) );
if (!tmp) goto exit;
else profiles = tmp;
len = sizeof(WCHAR) * (lstrlenW( data.cFileName ) + 1);
- profiles[count] = HeapAlloc( GetProcessHeap(), 0, len );
-
- if (!profiles[count]) goto exit;
+ if (!(profiles[count] = malloc( len ))) goto exit;
else
{
TRACE( "matching profile: %s\n", debugstr_w(data.cFileName) );
@@ -1003,9 +974,8 @@ BOOL WINAPI EnumColorProfilesW( PCWSTR machine, PENUMTYPEW record, PBYTE buffer,
if (number) *number = count;
exit:
- for (i = 0; i < count; i++)
- HeapFree( GetProcessHeap(), 0, profiles[i] );
- HeapFree( GetProcessHeap(), 0, profiles );
+ for (i = 0; i < count; i++) free( profiles[i] );
+ free( profiles );
FindClose( find );
return ret;
@@ -1027,14 +997,11 @@ BOOL WINAPI InstallColorProfileA( PCSTR machine, PCSTR profile )
if (machine || !profile) return FALSE;
len = MultiByteToWideChar( CP_ACP, 0, profile, -1, NULL, 0 );
- profileW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
-
- if (profileW)
+ if ((profileW = malloc( len * sizeof(WCHAR) )))
{
MultiByteToWideChar( CP_ACP, 0, profile, -1, profileW, len );
-
ret = InstallColorProfileW( NULL, profileW );
- HeapFree( GetProcessHeap(), 0, profileW );
+ free( profileW );
}
return ret;
}
@@ -1065,7 +1032,6 @@ BOOL WINAPI InstallColorProfileW( PCWSTR machine, PCWSTR profile )
if (!GetColorDirectoryW( machine, dest, &size )) return FALSE;
basename( profile, base );
-
lstrcatW( dest, L"\\" );
lstrcatW( dest, base );
@@ -1225,15 +1191,11 @@ BOOL WINAPI UninstallColorProfileA( PCSTR machine, PCSTR profile, BOOL delete )
if (machine || !profile) return FALSE;
len = MultiByteToWideChar( CP_ACP, 0, profile, -1, NULL, 0 );
- profileW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
-
- if (profileW)
+ if ((profileW = malloc( len * sizeof(WCHAR) )))
{
MultiByteToWideChar( CP_ACP, 0, profile, -1, profileW, len );
-
ret = UninstallColorProfileW( NULL, profileW , delete );
-
- HeapFree( GetProcessHeap(), 0, profileW );
+ free( profileW );
}
return ret;
}
@@ -1260,7 +1222,6 @@ BOOL WINAPI UninstallColorProfileW( PCWSTR machine, PCWSTR profile, BOOL delete
if (machine || !profile) return FALSE;
if (delete) return DeleteFileW( profile );
-
return TRUE;
}
@@ -1269,7 +1230,7 @@ static BOOL profile_AtoW( const PROFILE *in, PROFILE *out )
int len;
if (!in->pProfileData) return FALSE;
len = MultiByteToWideChar( CP_ACP, 0, in->pProfileData, -1, NULL, 0 );
- if (!(out->pProfileData = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return FALSE;
+ if (!(out->pProfileData = malloc( len * sizeof(WCHAR) ))) return FALSE;
out->cbDataSize = len * sizeof(WCHAR);
MultiByteToWideChar( CP_ACP, 0, in->pProfileData, -1, out->pProfileData, len );
out->dwType = in->dwType;
@@ -1296,7 +1257,7 @@ HPROFILE WINAPI OpenColorProfileA( PPROFILE profile, DWORD access, DWORD sharing
if (!profile_AtoW( profile, &profileW )) return FALSE;
handle = OpenColorProfileW( &profileW, access, sharing, creation );
- HeapFree( GetProcessHeap(), 0, profileW.pProfileData );
+ free( profileW.pProfileData );
return handle;
}
@@ -1339,12 +1300,12 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
{
/* FIXME: access flags not implemented for memory based profiles */
- if (!(data = HeapAlloc( GetProcessHeap(), 0, profile->cbDataSize ))) return NULL;
+ if (!(data = malloc( profile->cbDataSize ))) return NULL;
memcpy( data, profile->pProfileData, profile->cbDataSize );
if (!(cmsprofile = cmsOpenProfileFromMem( data, profile->cbDataSize )))
{
- HeapFree( GetProcessHeap(), 0, data );
+ free( data );
return FALSE;
}
size = profile->cbDataSize;
@@ -1370,14 +1331,14 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
if (!GetColorDirectoryW( NULL, NULL, &size ) && GetLastError() == ERROR_MORE_DATA)
{
size += (lstrlenW( profile->pProfileData ) + 2) * sizeof(WCHAR);
- if (!(path = HeapAlloc( GetProcessHeap(), 0, size ))) return NULL;
+ if (!(path = malloc( size ))) return NULL;
GetColorDirectoryW( NULL, path, &size );
PathAddBackslashW( path );
lstrcatW( path, profile->pProfileData );
}
else return NULL;
handle = CreateFileW( path, flags, sharing, NULL, creation, 0, NULL );
- HeapFree( GetProcessHeap(), 0, path );
+ free( path );
}
if (handle == INVALID_HANDLE_VALUE)
{
@@ -1390,7 +1351,7 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
CloseHandle( handle );
return NULL;
}
- if (!(data = HeapAlloc( GetProcessHeap(), 0, size )))
+ if (!(data = malloc( size )))
{
ERR( "Unable to allocate memory for color profile\n" );
CloseHandle( handle );
@@ -1399,15 +1360,14 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
if (!ReadFile( handle, data, size, &read, NULL ) || read != size)
{
ERR( "Unable to read color profile\n" );
-
CloseHandle( handle );
- HeapFree( GetProcessHeap(), 0, data );
+ free( data );
return NULL;
}
if (!(cmsprofile = cmsOpenProfileFromMem( data, size )))
{
CloseHandle( handle );
- HeapFree( GetProcessHeap(), 0, data );
+ free( data );
return NULL;
}
}
@@ -1426,7 +1386,7 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
if ((hprof = create_profile( &prof ))) return hprof;
cmsCloseProfile( cmsprofile );
- HeapFree( GetProcessHeap(), 0, data );
+ free( data );
CloseHandle( handle );
return NULL;
}
@@ -1509,9 +1469,9 @@ HPROFILE WINAPI WcsOpenColorProfileA( PROFILE *cdm, PROFILE *camp, PROFILE *gmmp
ret = WcsOpenColorProfileW( &cdmW, &campW, &gmmpW, access, sharing, creation, flags );
done:
- HeapFree( GetProcessHeap(), 0, cdmW.pProfileData );
- HeapFree( GetProcessHeap(), 0, campW.pProfileData );
- HeapFree( GetProcessHeap(), 0, gmmpW.pProfileData );
+ free( cdmW.pProfileData );
+ free( campW.pProfileData );
+ free( gmmpW.pProfileData );
return ret;
}
--
2.30.2
1
0
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mscms/mscms_priv.h | 15 ---------------
1 file changed, 15 deletions(-)
diff --git a/dlls/mscms/mscms_priv.h b/dlls/mscms/mscms_priv.h
index 7a4a35ebc24..29895fb8ae8 100644
--- a/dlls/mscms/mscms_priv.h
+++ b/dlls/mscms/mscms_priv.h
@@ -65,19 +65,4 @@ extern BOOL set_tag_data( const struct profile *, TAGTYPE, DWORD, const void *,
extern void get_profile_header( const struct profile *, PROFILEHEADER * ) DECLSPEC_HIDDEN;
extern void set_profile_header( const struct profile *, const PROFILEHEADER * ) DECLSPEC_HIDDEN;
-struct lcms_funcs
-{
- void * (CDECL *open_profile)( void *data, DWORD size );
- void (CDECL *close_profile)( void *profile );
- void * (CDECL *create_transform)( void *output, void *target, DWORD intent );
- void * (CDECL *create_multi_transform)( void *profiles, DWORD count, DWORD intent );
- BOOL (CDECL *translate_bits)( void *transform, void *srcbits, BMFORMAT input,
- void *dstbits, BMFORMAT output, DWORD size );
- BOOL (CDECL *translate_colors)( void *transform, COLOR *in, DWORD count, COLORTYPE input_type,
- COLOR *out, COLORTYPE output_type );
- void (CDECL *close_transform)( void *transform );
-};
-
-extern const struct lcms_funcs *lcms_funcs;
-
extern const char *dbgstr_tag(DWORD) DECLSPEC_HIDDEN;
--
2.30.2
1
0
[PATCH 3/5] mscms/tests: Get rid of workarounds for old Windows versions.
by Hans Leidekker 30 May '22
by Hans Leidekker 30 May '22
30 May '22
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mscms/tests/Makefile.in | 2 +-
dlls/mscms/tests/profile.c | 546 +++++++++++++----------------------
2 files changed, 195 insertions(+), 353 deletions(-)
diff --git a/dlls/mscms/tests/Makefile.in b/dlls/mscms/tests/Makefile.in
index 2d229c049ab..5dd9975434a 100644
--- a/dlls/mscms/tests/Makefile.in
+++ b/dlls/mscms/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = mscms.dll
-IMPORTS = advapi32
+IMPORTS = mscms user32 advapi32
C_SRCS = \
profile.c
diff --git a/dlls/mscms/tests/profile.c b/dlls/mscms/tests/profile.c
index e5f924fb2da..c579dc86540 100644
--- a/dlls/mscms/tests/profile.c
+++ b/dlls/mscms/tests/profile.c
@@ -30,79 +30,6 @@
#include "wine/test.h"
-static HMODULE hmscms;
-static HMODULE huser32;
-
-static BOOL (WINAPI *pAssociateColorProfileWithDeviceA)(PCSTR,PCSTR,PCSTR);
-static BOOL (WINAPI *pCloseColorProfile)(HPROFILE);
-static HTRANSFORM (WINAPI *pCreateMultiProfileTransform)(PHPROFILE,DWORD,PDWORD,DWORD,DWORD,DWORD);
-static BOOL (WINAPI *pDeleteColorTransform)(HTRANSFORM);
-static BOOL (WINAPI *pDisassociateColorProfileFromDeviceA)(PCSTR,PCSTR,PCSTR);
-static BOOL (WINAPI *pGetColorDirectoryA)(PCHAR,PCHAR,PDWORD);
-static BOOL (WINAPI *pGetColorDirectoryW)(PWCHAR,PWCHAR,PDWORD);
-static BOOL (WINAPI *pGetColorProfileElement)(HPROFILE,TAGTYPE,DWORD,PDWORD,PVOID,PBOOL);
-static BOOL (WINAPI *pGetColorProfileElementTag)(HPROFILE,DWORD,PTAGTYPE);
-static BOOL (WINAPI *pGetColorProfileFromHandle)(HPROFILE,PBYTE,PDWORD);
-static BOOL (WINAPI *pGetColorProfileHeader)(HPROFILE,PPROFILEHEADER);
-static BOOL (WINAPI *pGetCountColorProfileElements)(HPROFILE,PDWORD);
-static BOOL (WINAPI *pGetStandardColorSpaceProfileA)(PCSTR,DWORD,PSTR,PDWORD);
-static BOOL (WINAPI *pGetStandardColorSpaceProfileW)(PCWSTR,DWORD,PWSTR,PDWORD);
-static BOOL (WINAPI *pEnumColorProfilesA)(PCSTR,PENUMTYPEA,PBYTE,PDWORD,PDWORD);
-static BOOL (WINAPI *pEnumColorProfilesW)(PCWSTR,PENUMTYPEW,PBYTE,PDWORD,PDWORD);
-static BOOL (WINAPI *pInstallColorProfileA)(PCSTR,PCSTR);
-static BOOL (WINAPI *pInstallColorProfileW)(PCWSTR,PCWSTR);
-static BOOL (WINAPI *pIsColorProfileTagPresent)(HPROFILE,TAGTYPE,PBOOL);
-static HPROFILE (WINAPI *pOpenColorProfileA)(PPROFILE,DWORD,DWORD,DWORD);
-static HPROFILE (WINAPI *pOpenColorProfileW)(PPROFILE,DWORD,DWORD,DWORD);
-static BOOL (WINAPI *pSetColorProfileElement)(HPROFILE,TAGTYPE,DWORD,PDWORD,PVOID);
-static BOOL (WINAPI *pSetColorProfileHeader)(HPROFILE,PPROFILEHEADER);
-static BOOL (WINAPI *pSetStandardColorSpaceProfileA)(PCSTR,DWORD,PSTR);
-static BOOL (WINAPI *pSetStandardColorSpaceProfileW)(PCWSTR,DWORD,PWSTR);
-static BOOL (WINAPI *pTranslateBitmapBits)(HTRANSFORM,PVOID,BMFORMAT,DWORD,DWORD,DWORD,PVOID,BMFORMAT,DWORD,PBMCALLBACKFN,ULONG);
-static BOOL (WINAPI *pUninstallColorProfileA)(PCSTR,PCSTR,BOOL);
-static BOOL (WINAPI *pUninstallColorProfileW)(PCWSTR,PCWSTR,BOOL);
-
-static BOOL (WINAPI *pEnumDisplayDevicesA)(LPCSTR,DWORD,PDISPLAY_DEVICEA,DWORD);
-
-#define GETFUNCPTR(func) p##func = (void *)GetProcAddress( hmscms, #func ); \
- if (!p##func) return FALSE;
-
-static BOOL init_function_ptrs( void )
-{
- GETFUNCPTR( AssociateColorProfileWithDeviceA )
- GETFUNCPTR( CloseColorProfile )
- GETFUNCPTR( CreateMultiProfileTransform )
- GETFUNCPTR( DeleteColorTransform )
- GETFUNCPTR( DisassociateColorProfileFromDeviceA )
- GETFUNCPTR( GetColorDirectoryA )
- GETFUNCPTR( GetColorDirectoryW )
- GETFUNCPTR( GetColorProfileElement )
- GETFUNCPTR( GetColorProfileElementTag )
- GETFUNCPTR( GetColorProfileFromHandle )
- GETFUNCPTR( GetColorProfileHeader )
- GETFUNCPTR( GetCountColorProfileElements )
- GETFUNCPTR( GetStandardColorSpaceProfileA )
- GETFUNCPTR( GetStandardColorSpaceProfileW )
- GETFUNCPTR( EnumColorProfilesA )
- GETFUNCPTR( EnumColorProfilesW )
- GETFUNCPTR( InstallColorProfileA )
- GETFUNCPTR( InstallColorProfileW )
- GETFUNCPTR( IsColorProfileTagPresent )
- GETFUNCPTR( OpenColorProfileA )
- GETFUNCPTR( OpenColorProfileW )
- GETFUNCPTR( SetColorProfileElement )
- GETFUNCPTR( SetColorProfileHeader )
- GETFUNCPTR( SetStandardColorSpaceProfileA )
- GETFUNCPTR( SetStandardColorSpaceProfileW )
- GETFUNCPTR( UninstallColorProfileA )
- GETFUNCPTR( UninstallColorProfileW )
- GETFUNCPTR( TranslateBitmapBits )
-
- pEnumDisplayDevicesA = (void *)GetProcAddress( huser32, "EnumDisplayDevicesA" );
-
- return TRUE;
-}
-
static const char machine[] = "dummy";
static const WCHAR machineW[] = L"dummy";
@@ -161,26 +88,24 @@ static void test_GetColorDirectoryA(void)
char buffer[MAX_PATH];
/* Parameter checks */
-
- ret = pGetColorDirectoryA( NULL, NULL, NULL );
+ ret = GetColorDirectoryA( NULL, NULL, NULL );
ok( !ret, "GetColorDirectoryA() succeeded (%lu)\n", GetLastError() );
size = 0;
- ret = pGetColorDirectoryA( NULL, NULL, &size );
+ ret = GetColorDirectoryA( NULL, NULL, &size );
ok( !ret && size > 0, "GetColorDirectoryA() succeeded (%lu)\n", GetLastError() );
size = 0;
- ret = pGetColorDirectoryA( NULL, buffer, &size );
+ ret = GetColorDirectoryA( NULL, buffer, &size );
ok( !ret && size > 0, "GetColorDirectoryA() succeeded (%lu)\n", GetLastError() );
size = 1;
- ret = pGetColorDirectoryA( NULL, buffer, &size );
+ ret = GetColorDirectoryA( NULL, buffer, &size );
ok( !ret && size > 0, "GetColorDirectoryA() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
size = sizeof(buffer);
- ret = pGetColorDirectoryA( NULL, buffer, &size );
+ ret = GetColorDirectoryA( NULL, buffer, &size );
ok( ret && size > 0, "GetColorDirectoryA() failed (%lu)\n", GetLastError() );
}
@@ -191,28 +116,24 @@ static void test_GetColorDirectoryW(void)
WCHAR buffer[MAX_PATH];
/* Parameter checks */
-
- /* This one crashes win2k
- ret = pGetColorDirectoryW( NULL, NULL, NULL );
+ ret = GetColorDirectoryW( NULL, NULL, NULL );
ok( !ret, "GetColorDirectoryW() succeeded (%lu)\n", GetLastError() );
- */
size = 0;
- ret = pGetColorDirectoryW( NULL, NULL, &size );
+ ret = GetColorDirectoryW( NULL, NULL, &size );
ok( !ret && size > 0, "GetColorDirectoryW() succeeded (%lu)\n", GetLastError() );
size = 0;
- ret = pGetColorDirectoryW( NULL, buffer, &size );
+ ret = GetColorDirectoryW( NULL, buffer, &size );
ok( !ret && size > 0, "GetColorDirectoryW() succeeded (%lu)\n", GetLastError() );
size = 1;
- ret = pGetColorDirectoryW( NULL, buffer, &size );
+ ret = GetColorDirectoryW( NULL, buffer, &size );
ok( !ret && size > 0, "GetColorDirectoryW() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
size = sizeof(buffer);
- ret = pGetColorDirectoryW( NULL, buffer, &size );
+ ret = GetColorDirectoryW( NULL, buffer, &size );
ok( ret && size > 0, "GetColorDirectoryW() failed (%lu)\n", GetLastError() );
}
@@ -232,31 +153,29 @@ static void test_GetColorProfileElement( char *standardprofile )
profile.pProfileData = standardprofile;
profile.cbDataSize = strlen(standardprofile);
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
/* Parameter checks */
-
- ret = pGetColorProfileElement( handle, tag, 0, NULL, NULL, &ref );
+ ret = GetColorProfileElement( handle, tag, 0, NULL, NULL, &ref );
ok( !ret, "GetColorProfileElement() succeeded (%lu)\n", GetLastError() );
- ret = pGetColorProfileElement( handle, tag, 0, &size, NULL, NULL );
+ ret = GetColorProfileElement( handle, tag, 0, &size, NULL, NULL );
ok( !ret, "GetColorProfileElement() succeeded (%lu)\n", GetLastError() );
size = 0;
- ret = pGetColorProfileElement( handle, tag, 0, &size, NULL, &ref );
+ ret = GetColorProfileElement( handle, tag, 0, &size, NULL, &ref );
ok( !ret, "GetColorProfileElement() succeeded\n" );
ok( size > 0, "wrong size\n" );
/* Functional checks */
-
size = sizeof(buffer);
- ret = pGetColorProfileElement( handle, tag, 0, &size, buffer, &ref );
+ ret = GetColorProfileElement( handle, tag, 0, &size, buffer, &ref );
ok( ret, "GetColorProfileElement() failed %lu\n", GetLastError() );
ok( size > 0, "wrong size\n" );
ok( !memcmp( buffer, expect, sizeof(expect)-1 ), "Unexpected tag data\n" );
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -274,29 +193,27 @@ static void test_GetColorProfileElementTag( char *standardprofile )
profile.pProfileData = standardprofile;
profile.cbDataSize = strlen(standardprofile);
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
/* Parameter checks */
-
- ret = pGetColorProfileElementTag( NULL, index, &tag );
+ ret = GetColorProfileElementTag( NULL, index, &tag );
ok( !ret, "GetColorProfileElementTag() succeeded (%lu)\n", GetLastError() );
- ret = pGetColorProfileElementTag( handle, 0, &tag );
+ ret = GetColorProfileElementTag( handle, 0, &tag );
ok( !ret, "GetColorProfileElementTag() succeeded (%lu)\n", GetLastError() );
- ret = pGetColorProfileElementTag( handle, index, NULL );
+ ret = GetColorProfileElementTag( handle, index, NULL );
ok( !ret, "GetColorProfileElementTag() succeeded (%lu)\n", GetLastError() );
- ret = pGetColorProfileElementTag( handle, 18, NULL );
+ ret = GetColorProfileElementTag( handle, 18, NULL );
ok( !ret, "GetColorProfileElementTag() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
- while ((ret = pGetColorProfileElementTag( handle, index, &tag )) && tag != expect) index++;
+ while ((ret = GetColorProfileElementTag( handle, index, &tag )) && tag != expect) index++;
ok( ret && tag == expect, "GetColorProfileElementTag() failed (%lu)\n", GetLastError() );
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -315,29 +232,25 @@ static void test_GetColorProfileFromHandle( char *testprofile )
profile.pProfileData = testprofile;
profile.cbDataSize = strlen(testprofile);
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
/* Parameter checks */
-
size = 0;
-
- ret = pGetColorProfileFromHandle( handle, NULL, &size );
+ ret = GetColorProfileFromHandle( handle, NULL, &size );
ok( !ret && size > 0, "GetColorProfileFromHandle() failed (%lu)\n", GetLastError() );
buffer = HeapAlloc( GetProcessHeap(), 0, size );
-
if (buffer)
{
- ret = pGetColorProfileFromHandle( NULL, buffer, &size );
+ ret = GetColorProfileFromHandle( NULL, buffer, &size );
ok( !ret, "GetColorProfileFromHandle() succeeded (%lu)\n", GetLastError() );
- ret = pGetColorProfileFromHandle( handle, buffer, NULL );
+ ret = GetColorProfileFromHandle( handle, buffer, NULL );
ok( !ret, "GetColorProfileFromHandle() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
- ret = pGetColorProfileFromHandle( handle, buffer, &size );
+ ret = GetColorProfileFromHandle( handle, buffer, &size );
ok( ret && size > 0, "GetColorProfileFromHandle() failed (%lu)\n", GetLastError() );
header = (PROFILEHEADER *)buffer;
@@ -350,11 +263,10 @@ static void test_GetColorProfileFromHandle( char *testprofile )
ok( header->phIlluminant.ciexyzX == 0xd6f60000, "wrong phIlluminant.ciexyzX %lx\n", header->phIlluminant.ciexyzX );
ok( header->phIlluminant.ciexyzY == 0x00000100, "wrong phIlluminant.ciexyzY %lx\n", header->phIlluminant.ciexyzY );
ok( header->phIlluminant.ciexyzZ == 0x2dd30000, "wrong phIlluminant.ciexyzZ %lx\n", header->phIlluminant.ciexyzZ );
-
HeapFree( GetProcessHeap(), 0, buffer );
}
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -371,26 +283,24 @@ static void test_GetColorProfileHeader( char *testprofile )
profile.pProfileData = testprofile;
profile.cbDataSize = strlen(testprofile);
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
/* Parameter checks */
-
- ret = pGetColorProfileHeader( NULL, NULL );
+ ret = GetColorProfileHeader( NULL, NULL );
ok( !ret, "GetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
- ret = pGetColorProfileHeader( NULL, &header );
+ ret = GetColorProfileHeader( NULL, &header );
ok( !ret, "GetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
if (0) /* Crashes on Vista */
{
- ret = pGetColorProfileHeader( handle, NULL );
- ok( !ret, "GetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
+ ret = GetColorProfileHeader( handle, NULL );
+ ok( !ret, "GetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
}
/* Functional checks */
-
- ret = pGetColorProfileHeader( handle, &header );
+ ret = GetColorProfileHeader( handle, &header );
ok( ret, "GetColorProfileHeader() failed (%lu)\n", GetLastError() );
ok( header.phClass == 0x6d6e7472, "wrong phClass %#lx\n", header.phClass );
@@ -403,7 +313,7 @@ static void test_GetColorProfileHeader( char *testprofile )
ok( header.phIlluminant.ciexyzY == 0x00010000, "wrong phIlluminant.ciexyzY %#lx\n", header.phIlluminant.ciexyzY );
ok( header.phIlluminant.ciexyzZ == 0x0000d32d, "wrong phIlluminant.ciexyzZ %#lx\n", header.phIlluminant.ciexyzZ );
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -420,24 +330,22 @@ static void test_GetCountColorProfileElements( char *standardprofile )
profile.pProfileData = standardprofile;
profile.cbDataSize = strlen(standardprofile);
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
/* Parameter checks */
-
- ret = pGetCountColorProfileElements( NULL, &count );
+ ret = GetCountColorProfileElements( NULL, &count );
ok( !ret, "GetCountColorProfileElements() succeeded (%lu)\n", GetLastError() );
- ret = pGetCountColorProfileElements( handle, NULL );
+ ret = GetCountColorProfileElements( handle, NULL );
ok( !ret, "GetCountColorProfileElements() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
- ret = pGetCountColorProfileElements( handle, &count );
+ ret = GetCountColorProfileElements( handle, &count );
ok( ret && count > 15 && count < 20,
"GetCountColorProfileElements() failed (%lu) %lu\n", GetLastError(), count );
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -448,75 +356,70 @@ static void test_GetStandardColorSpaceProfileA( char *standardprofile )
CHAR oldprofile[MAX_PATH];
CHAR newprofile[MAX_PATH];
- /* Parameter checks */
-
/* Single invalid parameter checks: */
-
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 1st param, */
- ret = pGetStandardColorSpaceProfileA(machine, LCS_sRGB, newprofile, &size);
+ ret = GetStandardColorSpaceProfileA(machine, LCS_sRGB, newprofile, &size);
ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 2nd param, */
- ret = pGetStandardColorSpaceProfileA(NULL, (DWORD)-1, newprofile, &size);
+ ret = GetStandardColorSpaceProfileA(NULL, (DWORD)-1, newprofile, &size);
ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 4th param, */
- ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, NULL);
+ ret = GetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, NULL);
ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 3rd param, */
- ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, NULL, &size);
+ ret = GetStandardColorSpaceProfileA(NULL, LCS_sRGB, NULL, &size);
ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = 0;
SetLastError(0xfaceabee); /* dereferenced 4th param, */
- ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, &size);
+ ret = GetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, &size);
ok( !ret && (GetLastError() == ERROR_MORE_DATA || GetLastError() == ERROR_INSUFFICIENT_BUFFER),
"GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n", ret, GetLastError() );
/* Several invalid parameter checks: */
-
size = 0;
SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */
- ret = pGetStandardColorSpaceProfileA(machine, 0, newprofile, &size);
+ ret = GetStandardColorSpaceProfileA(machine, 0, newprofile, &size);
ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED),
"GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n", ret, GetLastError() );
SetLastError(0xfaceabee); /* maybe 2nd and then 4th param, */
- ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, NULL);
+ ret = GetStandardColorSpaceProfileA(NULL, 0, newprofile, NULL);
ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = 0;
SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */
- ret = pGetStandardColorSpaceProfileA(NULL, 0, NULL, &size);
+ ret = GetStandardColorSpaceProfileA(NULL, 0, NULL, &size);
ok( !ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || GetLastError() == ERROR_FILE_NOT_FOUND),
"GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n", ret, GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* maybe 2nd param. */
- ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, &size);
+ ret = GetStandardColorSpaceProfileA(NULL, 0, newprofile, &size);
if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n",
ret, GetLastError() );
else ok( !lstrcmpiA( newprofile, "" ) && GetLastError() == 0xfaceabee,
"GetStandardColorSpaceProfileA() returns %d (GLE=%lu)\n", ret, GetLastError() );
/* Functional checks */
-
size = sizeof(oldprofile);
- ret = pGetStandardColorSpaceProfileA( NULL, LCS_sRGB, oldprofile, &size );
+ ret = GetStandardColorSpaceProfileA( NULL, LCS_sRGB, oldprofile, &size );
ok( ret, "GetStandardColorSpaceProfileA() failed (%lu)\n", GetLastError() );
SetLastError(0xdeadbeef);
- ret = pSetStandardColorSpaceProfileA( NULL, LCS_sRGB, standardprofile );
+ ret = SetStandardColorSpaceProfileA( NULL, LCS_sRGB, standardprofile );
if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
{
skip("Not enough rights for SetStandardColorSpaceProfileA\n");
@@ -525,10 +428,10 @@ static void test_GetStandardColorSpaceProfileA( char *standardprofile )
ok( ret, "SetStandardColorSpaceProfileA() failed (%lu)\n", GetLastError() );
size = sizeof(newprofile);
- ret = pGetStandardColorSpaceProfileA( NULL, LCS_sRGB, newprofile, &size );
+ ret = GetStandardColorSpaceProfileA( NULL, LCS_sRGB, newprofile, &size );
ok( ret, "GetStandardColorSpaceProfileA() failed (%lu)\n", GetLastError() );
- ret = pSetStandardColorSpaceProfileA( NULL, LCS_sRGB, oldprofile );
+ ret = SetStandardColorSpaceProfileA( NULL, LCS_sRGB, oldprofile );
ok( ret, "SetStandardColorSpaceProfileA() failed (%lu)\n", GetLastError() );
}
@@ -540,77 +443,69 @@ static void test_GetStandardColorSpaceProfileW( WCHAR *standardprofileW )
WCHAR newprofile[MAX_PATH];
CHAR newprofileA[MAX_PATH];
- /* Parameter checks */
-
/* Single invalid parameter checks: */
-
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 1st param, */
- ret = pGetStandardColorSpaceProfileW(machineW, LCS_sRGB, newprofile, &size);
+ ret = GetStandardColorSpaceProfileW(machineW, LCS_sRGB, newprofile, &size);
ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileW() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 2nd param, */
- ret = pGetStandardColorSpaceProfileW(NULL, (DWORD)-1, newprofile, &size);
+ ret = GetStandardColorSpaceProfileW(NULL, (DWORD)-1, newprofile, &size);
ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 2nd param, */
- ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &size);
- ok( (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) ||
- broken(ret), /* Win98 and WinME */
+ ret = GetStandardColorSpaceProfileW(NULL, 0, newprofile, &size);
+ ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"GetStandardColorSpaceProfileW() returns %d (GLE=%lu)\n", ret, GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 3rd param, */
- ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, NULL, &size);
- ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" );
- ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
- broken(GetLastError() == 0xfaceabee) /* win98 */,
+ ret = GetStandardColorSpaceProfileW(NULL, LCS_sRGB, NULL, &size);
+ ok( !ret, "GetStandardColorSpaceProfileW succeeded\n" );
+ ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"GetStandardColorSpaceProfileW() returns GLE=%lu\n", GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* 4th param, */
- ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, NULL);
+ ret = GetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, NULL);
ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = 0;
SetLastError(0xfaceabee); /* dereferenced 4th param. */
- ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, &size);
- ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" );
+ ret = GetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, &size);
+ ok( !ret, "GetStandardColorSpaceProfileW succeeded\n" );
ok( GetLastError() == ERROR_MORE_DATA ||
- GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
- broken(GetLastError() == 0xfaceabee) /* win98 */,
+ GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"GetStandardColorSpaceProfileW() returns GLE=%lu\n", GetLastError() );
/* Several invalid parameter checks: */
-
size = 0;
SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */
- ret = pGetStandardColorSpaceProfileW(machineW, 0, newprofile, &size);
+ ret = GetStandardColorSpaceProfileW(machineW, 0, newprofile, &size);
ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED),
"GetStandardColorSpaceProfileW() returns %d (GLE=%lu)\n", ret, GetLastError() );
SetLastError(0xfaceabee); /* maybe 2nd and then 4th param, */
- ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, NULL);
+ ret = GetStandardColorSpaceProfileW(NULL, 0, newprofile, NULL);
ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%lu)\n",
ret, GetLastError() );
size = 0;
SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */
- ret = pGetStandardColorSpaceProfileW(NULL, 0, NULL, &size);
- ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" );
+ ret = GetStandardColorSpaceProfileW(NULL, 0, NULL, &size);
+ ok( !ret, "GetStandardColorSpaceProfileW succeeded\n" );
ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
- GetLastError() == ERROR_FILE_NOT_FOUND ||
- broken(GetLastError() == 0xfaceabee) /* win98 */,
+ GetLastError() == ERROR_FILE_NOT_FOUND,
"GetStandardColorSpaceProfileW() returns GLE=%lu\n", GetLastError() );
size = sizeof(newprofile);
SetLastError(0xfaceabee); /* maybe 2nd param. */
- ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &size);
+ ret = GetStandardColorSpaceProfileW(NULL, 0, newprofile, &size);
if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%lu)\n",
ret, GetLastError() );
else
@@ -621,13 +516,12 @@ static void test_GetStandardColorSpaceProfileW( WCHAR *standardprofileW )
}
/* Functional checks */
-
size = sizeof(oldprofile);
- ret = pGetStandardColorSpaceProfileW( NULL, LCS_sRGB, oldprofile, &size );
+ ret = GetStandardColorSpaceProfileW( NULL, LCS_sRGB, oldprofile, &size );
ok( ret, "GetStandardColorSpaceProfileW() failed (%lu)\n", GetLastError() );
SetLastError(0xdeadbeef);
- ret = pSetStandardColorSpaceProfileW( NULL, LCS_sRGB, standardprofileW );
+ ret = SetStandardColorSpaceProfileW( NULL, LCS_sRGB, standardprofileW );
if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
{
skip("Not enough rights for SetStandardColorSpaceProfileW\n");
@@ -636,10 +530,10 @@ static void test_GetStandardColorSpaceProfileW( WCHAR *standardprofileW )
ok( ret, "SetStandardColorSpaceProfileW() failed (%lu)\n", GetLastError() );
size = sizeof(newprofile);
- ret = pGetStandardColorSpaceProfileW( NULL, LCS_sRGB, newprofile, &size );
+ ret = GetStandardColorSpaceProfileW( NULL, LCS_sRGB, newprofile, &size );
ok( ret, "GetStandardColorSpaceProfileW() failed (%lu)\n", GetLastError() );
- ret = pSetStandardColorSpaceProfileW( NULL, LCS_sRGB, oldprofile );
+ ret = SetStandardColorSpaceProfileW( NULL, LCS_sRGB, oldprofile );
ok( ret, "SetStandardColorSpaceProfileW() failed (%lu)\n", GetLastError() );
}
@@ -651,9 +545,7 @@ static void test_EnumColorProfilesA( char *standardprofile )
BYTE *buffer;
/* Parameter checks */
-
memset( &record, 0, sizeof(ENUMTYPEA) );
-
record.dwSize = sizeof(ENUMTYPEA);
record.dwVersion = ENUM_TYPE_VERSION;
record.dwFields |= ET_DATACOLORSPACE;
@@ -661,33 +553,32 @@ static void test_EnumColorProfilesA( char *standardprofile )
total = 0;
SetLastError( 0xdeadbeef );
- ret = pEnumColorProfilesA( NULL, &record, NULL, &total, &number );
+ ret = EnumColorProfilesA( NULL, &record, NULL, &total, &number );
ok( !ret, "EnumColorProfilesA succeeded\n" );
if (have_color_profile) ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError() );
buffer = HeapAlloc( GetProcessHeap(), 0, total );
size = total;
- ret = pEnumColorProfilesA( machine, &record, buffer, &size, &number );
+ ret = EnumColorProfilesA( machine, &record, buffer, &size, &number );
ok( !ret, "EnumColorProfilesA succeeded\n" );
- ret = pEnumColorProfilesA( NULL, NULL, buffer, &size, &number );
+ ret = EnumColorProfilesA( NULL, NULL, buffer, &size, &number );
ok( !ret, "EnumColorProfilesA succeeded\n" );
- ret = pEnumColorProfilesA( NULL, &record, buffer, NULL, &number );
+ ret = EnumColorProfilesA( NULL, &record, buffer, NULL, &number );
ok( !ret, "EnumColorProfilesA succeeded\n" );
- ret = pEnumColorProfilesA( NULL, &record, buffer, &size, &number );
+ ret = EnumColorProfilesA( NULL, &record, buffer, &size, &number );
todo_wine_if (!have_color_profile)
ok( ret, "EnumColorProfilesA failed %lu\n", GetLastError() );
size = 0;
- ret = pEnumColorProfilesA( NULL, &record, buffer, &size, &number );
+ ret = EnumColorProfilesA( NULL, &record, buffer, &size, &number );
ok( !ret, "EnumColorProfilesA succeeded\n" );
/* Functional checks */
-
size = total;
- ret = pEnumColorProfilesA( NULL, &record, buffer, &size, &number );
+ ret = EnumColorProfilesA( NULL, &record, buffer, &size, &number );
todo_wine_if (!have_color_profile)
ok( ret, "EnumColorProfilesA failed %lu\n", GetLastError() );
@@ -702,9 +593,7 @@ static void test_EnumColorProfilesW( WCHAR *standardprofileW )
BYTE *buffer;
/* Parameter checks */
-
memset( &record, 0, sizeof(ENUMTYPEW) );
-
record.dwSize = sizeof(ENUMTYPEW);
record.dwVersion = ENUM_TYPE_VERSION;
record.dwFields |= ET_DATACOLORSPACE;
@@ -712,33 +601,32 @@ static void test_EnumColorProfilesW( WCHAR *standardprofileW )
total = 0;
SetLastError( 0xdeadbeef );
- ret = pEnumColorProfilesW( NULL, &record, NULL, &total, &number );
+ ret = EnumColorProfilesW( NULL, &record, NULL, &total, &number );
ok( !ret, "EnumColorProfilesW succeeded\n" );
if (have_color_profile) ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError() );
buffer = HeapAlloc( GetProcessHeap(), 0, total * sizeof(WCHAR) );
size = total;
- ret = pEnumColorProfilesW( machineW, &record, buffer, &size, &number );
+ ret = EnumColorProfilesW( machineW, &record, buffer, &size, &number );
ok( !ret, "EnumColorProfilesW succeeded\n" );
- ret = pEnumColorProfilesW( NULL, NULL, buffer, &size, &number );
+ ret = EnumColorProfilesW( NULL, NULL, buffer, &size, &number );
ok( !ret, "EnumColorProfilesW succeeded\n" );
- ret = pEnumColorProfilesW( NULL, &record, buffer, NULL, &number );
+ ret = EnumColorProfilesW( NULL, &record, buffer, NULL, &number );
ok( !ret, "EnumColorProfilesW succeeded\n" );
- ret = pEnumColorProfilesW( NULL, &record, buffer, &size, &number );
+ ret = EnumColorProfilesW( NULL, &record, buffer, &size, &number );
todo_wine_if (!have_color_profile)
ok( ret, "EnumColorProfilesW failed %lu\n", GetLastError() );
size = 0;
- ret = pEnumColorProfilesW( NULL, &record, buffer, &size, &number );
+ ret = EnumColorProfilesW( NULL, &record, buffer, &size, &number );
ok( !ret, "EnumColorProfilesW succeeded\n" );
/* Functional checks */
-
size = total;
- ret = pEnumColorProfilesW( NULL, &record, buffer, &size, &number );
+ ret = EnumColorProfilesW( NULL, &record, buffer, &size, &number );
todo_wine_if (!have_color_profile)
ok( ret, "EnumColorProfilesW failed %lu\n", GetLastError() );
@@ -750,24 +638,22 @@ static void test_InstallColorProfileA( char *standardprofile, char *testprofile
BOOL ret;
/* Parameter checks */
-
- ret = pInstallColorProfileA( NULL, NULL );
+ ret = InstallColorProfileA( NULL, NULL );
ok( !ret, "InstallColorProfileA() succeeded (%lu)\n", GetLastError() );
- ret = pInstallColorProfileA( machine, NULL );
+ ret = InstallColorProfileA( machine, NULL );
ok( !ret, "InstallColorProfileA() succeeded (%lu)\n", GetLastError() );
- ret = pInstallColorProfileA( NULL, machine );
+ ret = InstallColorProfileA( NULL, machine );
ok( !ret, "InstallColorProfileA() succeeded (%lu)\n", GetLastError() );
if (standardprofile)
{
- ret = pInstallColorProfileA( NULL, standardprofile );
+ ret = InstallColorProfileA( NULL, standardprofile );
ok( ret, "InstallColorProfileA() failed (%lu)\n", GetLastError() );
}
/* Functional checks */
-
if (testprofile)
{
CHAR dest[MAX_PATH], base[MAX_PATH];
@@ -775,7 +661,7 @@ static void test_InstallColorProfileA( char *standardprofile, char *testprofile
HANDLE handle;
SetLastError(0xdeadbeef);
- ret = pInstallColorProfileA( NULL, testprofile );
+ ret = InstallColorProfileA( NULL, testprofile );
if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
{
skip("Not enough rights for InstallColorProfileA\n");
@@ -783,7 +669,7 @@ static void test_InstallColorProfileA( char *standardprofile, char *testprofile
}
ok( ret, "InstallColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pGetColorDirectoryA( NULL, dest, &size );
+ ret = GetColorDirectoryA( NULL, dest, &size );
ok( ret, "GetColorDirectoryA() failed (%lu)\n", GetLastError() );
MSCMS_basenameA( testprofile, base );
@@ -795,8 +681,8 @@ static void test_InstallColorProfileA( char *standardprofile, char *testprofile
handle = CreateFileA( dest, 0 , 0, NULL, OPEN_EXISTING, 0, NULL );
ok( handle != INVALID_HANDLE_VALUE, "Couldn't find the profile (%lu)\n", GetLastError() );
CloseHandle( handle );
-
- ret = pUninstallColorProfileA( NULL, dest, TRUE );
+
+ ret = UninstallColorProfileA( NULL, dest, TRUE );
ok( ret, "UninstallColorProfileA() failed (%lu)\n", GetLastError() );
}
}
@@ -806,24 +692,22 @@ static void test_InstallColorProfileW( WCHAR *standardprofileW, WCHAR *testprofi
BOOL ret;
/* Parameter checks */
-
- ret = pInstallColorProfileW( NULL, NULL );
+ ret = InstallColorProfileW( NULL, NULL );
ok( !ret, "InstallColorProfileW() succeeded (%lu)\n", GetLastError() );
- ret = pInstallColorProfileW( machineW, NULL );
+ ret = InstallColorProfileW( machineW, NULL );
ok( !ret, "InstallColorProfileW() succeeded (%lu)\n", GetLastError() );
- ret = pInstallColorProfileW( NULL, machineW );
+ ret = InstallColorProfileW( NULL, machineW );
ok( !ret, "InstallColorProfileW() failed (%lu)\n", GetLastError() );
if (standardprofileW)
{
- ret = pInstallColorProfileW( NULL, standardprofileW );
+ ret = InstallColorProfileW( NULL, standardprofileW );
ok( ret, "InstallColorProfileW() failed (%lu)\n", GetLastError() );
}
/* Functional checks */
-
if (testprofileW)
{
WCHAR dest[MAX_PATH], base[MAX_PATH];
@@ -831,7 +715,7 @@ static void test_InstallColorProfileW( WCHAR *standardprofileW, WCHAR *testprofi
HANDLE handle;
SetLastError(0xdeadbeef);
- ret = pInstallColorProfileW( NULL, testprofileW );
+ ret = InstallColorProfileW( NULL, testprofileW );
if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
{
skip("Not enough rights for InstallColorProfileW\n");
@@ -839,11 +723,10 @@ static void test_InstallColorProfileW( WCHAR *standardprofileW, WCHAR *testprofi
}
ok( ret, "InstallColorProfileW() failed (%lu)\n", GetLastError() );
- ret = pGetColorDirectoryW( NULL, dest, &size );
+ ret = GetColorDirectoryW( NULL, dest, &size );
ok( ret, "GetColorDirectoryW() failed (%lu)\n", GetLastError() );
MSCMS_basenameW( testprofileW, base );
-
lstrcatW( dest, L"\\" );
lstrcatW( dest, base );
@@ -852,7 +735,7 @@ static void test_InstallColorProfileW( WCHAR *standardprofileW, WCHAR *testprofi
ok( handle != INVALID_HANDLE_VALUE, "Couldn't find the profile (%lu)\n", GetLastError() );
CloseHandle( handle );
- ret = pUninstallColorProfileW( NULL, dest, TRUE );
+ ret = UninstallColorProfileW( NULL, dest, TRUE );
ok( ret, "UninstallColorProfileW() failed (%lu)\n", GetLastError() );
}
}
@@ -870,30 +753,26 @@ static void test_IsColorProfileTagPresent( char *standardprofile )
profile.pProfileData = standardprofile;
profile.cbDataSize = strlen(standardprofile);
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
/* Parameter checks */
-
tag = 0;
-
- ret = pIsColorProfileTagPresent( handle, tag, &present );
+ ret = IsColorProfileTagPresent( handle, tag, &present );
ok( !(ret && present), "IsColorProfileTagPresent() succeeded (%lu)\n", GetLastError() );
tag = 0x63707274; /* 'cprt' */
-
- ret = pIsColorProfileTagPresent( NULL, tag, &present );
+ ret = IsColorProfileTagPresent( NULL, tag, &present );
ok( !ret, "IsColorProfileTagPresent() succeeded (%lu)\n", GetLastError() );
- ret = pIsColorProfileTagPresent( handle, tag, NULL );
+ ret = IsColorProfileTagPresent( handle, tag, NULL );
ok( !ret, "IsColorProfileTagPresent() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
- ret = pIsColorProfileTagPresent( handle, tag, &present );
+ ret = IsColorProfileTagPresent( handle, tag, &present );
ok( ret && present, "IsColorProfileTagPresent() failed (%lu)\n", GetLastError() );
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -908,51 +787,49 @@ static void test_OpenColorProfileA( char *standardprofile )
profile.cbDataSize = 0;
/* Parameter checks */
-
- handle = pOpenColorProfileA( NULL, 0, 0, 0 );
+ handle = OpenColorProfileA( NULL, 0, 0, 0 );
ok( handle == NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileA( &profile, 0, 0, 0 );
+ handle = OpenColorProfileA( &profile, 0, 0, 0 );
ok( handle == NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, 0 );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, 0 );
ok( handle == NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileA( &profile, PROFILE_READWRITE, 0, 0 );
+ handle = OpenColorProfileA( &profile, PROFILE_READWRITE, 0, 0 );
ok( handle == NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- ok ( !pCloseColorProfile( NULL ), "CloseColorProfile() succeeded\n" );
+ ok( !CloseColorProfile( NULL ), "CloseColorProfile() succeeded\n" );
if (standardprofile)
{
profile.pProfileData = standardprofile;
profile.cbDataSize = strlen(standardprofile);
- handle = pOpenColorProfileA( &profile, 0, 0, 0 );
+ handle = OpenColorProfileA( &profile, 0, 0, 0 );
ok( handle == NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, 0 );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, 0 );
ok( handle == NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileA( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 );
+ handle = OpenColorProfileA( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 );
ok( handle == NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
/* Functional checks */
-
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pCloseColorProfile( handle );
+ ret = CloseColorProfile( handle );
ok( ret, "CloseColorProfile() failed (%lu)\n", GetLastError() );
profile.dwType = PROFILE_FILENAME;
profile.pProfileData = (void *)"sRGB Color Space Profile.icm";
profile.cbDataSize = sizeof("sRGB Color Space Profile.icm");
- handle = pOpenColorProfileA( &profile, PROFILE_READ, FILE_SHARE_READ, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, FILE_SHARE_READ, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pCloseColorProfile( handle );
+ ret = CloseColorProfile( handle );
ok( ret, "CloseColorProfile() failed (%lu)\n", GetLastError() );
}
}
@@ -968,41 +845,39 @@ static void test_OpenColorProfileW( WCHAR *standardprofileW )
profile.cbDataSize = 0;
/* Parameter checks */
-
- handle = pOpenColorProfileW( NULL, 0, 0, 0 );
+ handle = OpenColorProfileW( NULL, 0, 0, 0 );
ok( handle == NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileW( &profile, 0, 0, 0 );
+ handle = OpenColorProfileW( &profile, 0, 0, 0 );
ok( handle == NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileW( &profile, PROFILE_READ, 0, 0 );
+ handle = OpenColorProfileW( &profile, PROFILE_READ, 0, 0 );
ok( handle == NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileW( &profile, PROFILE_READWRITE, 0, 0 );
+ handle = OpenColorProfileW( &profile, PROFILE_READWRITE, 0, 0 );
ok( handle == NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
- ok ( !pCloseColorProfile( NULL ), "CloseColorProfile() succeeded\n" );
+ ok( !CloseColorProfile( NULL ), "CloseColorProfile() succeeded\n" );
if (standardprofileW)
{
profile.pProfileData = standardprofileW;
profile.cbDataSize = lstrlenW(standardprofileW) * sizeof(WCHAR);
- handle = pOpenColorProfileW( &profile, 0, 0, 0 );
+ handle = OpenColorProfileW( &profile, 0, 0, 0 );
ok( handle == NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileW( &profile, PROFILE_READ, 0, 0 );
+ handle = OpenColorProfileW( &profile, PROFILE_READ, 0, 0 );
ok( handle == NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
- handle = pOpenColorProfileW( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 );
+ handle = OpenColorProfileW( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 );
ok( handle == NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
/* Functional checks */
-
- handle = pOpenColorProfileW( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileW( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileW() failed (%lu)\n", GetLastError() );
- ret = pCloseColorProfile( handle );
+ ret = CloseColorProfile( handle );
ok( ret, "CloseColorProfile() failed (%lu)\n", GetLastError() );
}
}
@@ -1025,45 +900,42 @@ static void test_SetColorProfileElement( char *testprofile )
profile.cbDataSize = strlen(testprofile);
/* Parameter checks */
-
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pSetColorProfileElement( handle, tag, 0, &size, data );
+ ret = SetColorProfileElement( handle, tag, 0, &size, data );
ok( !ret, "SetColorProfileElement() succeeded (%lu)\n", GetLastError() );
+ CloseColorProfile( handle );
- pCloseColorProfile( handle );
-
- handle = pOpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pSetColorProfileElement( NULL, 0, 0, NULL, NULL );
+ ret = SetColorProfileElement( NULL, 0, 0, NULL, NULL );
ok( !ret, "SetColorProfileElement() succeeded (%lu)\n", GetLastError() );
- ret = pSetColorProfileElement( handle, 0, 0, NULL, NULL );
+ ret = SetColorProfileElement( handle, 0, 0, NULL, NULL );
ok( !ret, "SetColorProfileElement() succeeded (%lu)\n", GetLastError() );
- ret = pSetColorProfileElement( handle, tag, 0, NULL, NULL );
+ ret = SetColorProfileElement( handle, tag, 0, NULL, NULL );
ok( !ret, "SetColorProfileElement() succeeded (%lu)\n", GetLastError() );
- ret = pSetColorProfileElement( handle, tag, 0, &size, NULL );
+ ret = SetColorProfileElement( handle, tag, 0, &size, NULL );
ok( !ret, "SetColorProfileElement() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
size = sizeof(data);
- ret = pSetColorProfileElement( handle, tag, 0, &size, data );
+ ret = SetColorProfileElement( handle, tag, 0, &size, data );
ok( ret, "SetColorProfileElement() failed %lu\n", GetLastError() );
size = sizeof(buffer);
- ret = pGetColorProfileElement( handle, tag, 0, &size, buffer, &ref );
+ ret = GetColorProfileElement( handle, tag, 0, &size, buffer, &ref );
ok( ret, "GetColorProfileElement() failed %lu\n", GetLastError() );
ok( size > 0, "wrong size\n" );
ok( !memcmp( data, buffer, sizeof(data) ),
"Unexpected tag data, expected %s, got %s (%lu)\n", data, buffer, GetLastError() );
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -1103,38 +975,33 @@ static void test_SetColorProfileHeader( char *testprofile )
header.phCreator = 0x48502020;
/* Parameter checks */
-
- handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pSetColorProfileHeader( handle, &header );
+ ret = SetColorProfileHeader( handle, &header );
ok( !ret, "SetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
+ CloseColorProfile( handle );
- pCloseColorProfile( handle );
-
- handle = pOpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
+ handle = OpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
ok( handle != NULL, "OpenColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pSetColorProfileHeader( NULL, NULL );
+ ret = SetColorProfileHeader( NULL, NULL );
ok( !ret, "SetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
- ret = pSetColorProfileHeader( handle, NULL );
+ ret = SetColorProfileHeader( handle, NULL );
ok( !ret, "SetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
- ret = pSetColorProfileHeader( NULL, &header );
+ ret = SetColorProfileHeader( NULL, &header );
ok( !ret, "SetColorProfileHeader() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
- ret = pSetColorProfileHeader( handle, &header );
+ ret = SetColorProfileHeader( handle, &header );
ok( ret, "SetColorProfileHeader() failed (%lu)\n", GetLastError() );
- ret = pGetColorProfileHeader( handle, &header );
+ ret = GetColorProfileHeader( handle, &header );
ok( ret, "GetColorProfileHeader() failed (%lu)\n", GetLastError() );
-
ok( !memcmp( &header, rgbheader, sizeof(rgbheader) ), "Unexpected header data\n" );
-
- pCloseColorProfile( handle );
+ CloseColorProfile( handle );
}
}
@@ -1143,15 +1010,13 @@ static void test_UninstallColorProfileA( char *testprofile )
BOOL ret;
/* Parameter checks */
-
- ret = pUninstallColorProfileA( NULL, NULL, FALSE );
+ ret = UninstallColorProfileA( NULL, NULL, FALSE );
ok( !ret, "UninstallColorProfileA() succeeded (%lu)\n", GetLastError() );
- ret = pUninstallColorProfileA( machine, NULL, FALSE );
+ ret = UninstallColorProfileA( machine, NULL, FALSE );
ok( !ret, "UninstallColorProfileA() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
if (testprofile)
{
CHAR dest[MAX_PATH], base[MAX_PATH];
@@ -1159,7 +1024,7 @@ static void test_UninstallColorProfileA( char *testprofile )
HANDLE handle;
SetLastError(0xdeadbeef);
- ret = pInstallColorProfileA( NULL, testprofile );
+ ret = InstallColorProfileA( NULL, testprofile );
if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
{
skip("Not enough rights for InstallColorProfileA\n");
@@ -1167,15 +1032,14 @@ static void test_UninstallColorProfileA( char *testprofile )
}
ok( ret, "InstallColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pGetColorDirectoryA( NULL, dest, &size );
+ ret = GetColorDirectoryA( NULL, dest, &size );
ok( ret, "GetColorDirectoryA() failed (%lu)\n", GetLastError() );
MSCMS_basenameA( testprofile, base );
-
lstrcatA( dest, "\\" );
lstrcatA( dest, base );
- ret = pUninstallColorProfileA( NULL, dest, TRUE );
+ ret = UninstallColorProfileA( NULL, dest, TRUE );
ok( ret, "UninstallColorProfileA() failed (%lu)\n", GetLastError() );
/* Check if the profile is really gone */
@@ -1190,15 +1054,13 @@ static void test_UninstallColorProfileW( WCHAR *testprofileW )
BOOL ret;
/* Parameter checks */
-
- ret = pUninstallColorProfileW( NULL, NULL, FALSE );
+ ret = UninstallColorProfileW( NULL, NULL, FALSE );
ok( !ret, "UninstallColorProfileW() succeeded (%lu)\n", GetLastError() );
- ret = pUninstallColorProfileW( machineW, NULL, FALSE );
+ ret = UninstallColorProfileW( machineW, NULL, FALSE );
ok( !ret, "UninstallColorProfileW() succeeded (%lu)\n", GetLastError() );
/* Functional checks */
-
if (testprofileW)
{
WCHAR dest[MAX_PATH], base[MAX_PATH];
@@ -1208,7 +1070,7 @@ static void test_UninstallColorProfileW( WCHAR *testprofileW )
int bytes_copied;
SetLastError(0xdeadbeef);
- ret = pInstallColorProfileW( NULL, testprofileW );
+ ret = InstallColorProfileW( NULL, testprofileW );
if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
{
skip("Not enough rights for InstallColorProfileW\n");
@@ -1216,15 +1078,14 @@ static void test_UninstallColorProfileW( WCHAR *testprofileW )
}
ok( ret, "InstallColorProfileW() failed (%lu)\n", GetLastError() );
- ret = pGetColorDirectoryW( NULL, dest, &size );
+ ret = GetColorDirectoryW( NULL, dest, &size );
ok( ret, "GetColorDirectoryW() failed (%lu)\n", GetLastError() );
MSCMS_basenameW( testprofileW, base );
-
lstrcatW( dest, L"\\" );
lstrcatW( dest, base );
- ret = pUninstallColorProfileW( NULL, dest, TRUE );
+ ret = UninstallColorProfileW( NULL, dest, TRUE );
ok( ret, "UninstallColorProfileW() failed (%lu)\n", GetLastError() );
bytes_copied = WideCharToMultiByte(CP_ACP, 0, dest, -1, destA, MAX_PATH, NULL, NULL);
@@ -1244,69 +1105,69 @@ static void test_AssociateColorProfileWithDeviceA( char *testprofile )
DISPLAY_DEVICEA display, monitor;
BOOL res;
- if (testprofile && pEnumDisplayDevicesA)
+ if (testprofile)
{
display.cb = sizeof( DISPLAY_DEVICEA );
- res = pEnumDisplayDevicesA( NULL, 0, &display, 0 );
+ res = EnumDisplayDevicesA( NULL, 0, &display, 0 );
ok( res, "Can't get display info\n" );
monitor.cb = sizeof( DISPLAY_DEVICEA );
- res = pEnumDisplayDevicesA( display.DeviceName, 0, &monitor, 0 );
+ res = EnumDisplayDevicesA( display.DeviceName, 0, &monitor, 0 );
if (res)
{
SetLastError(0xdeadbeef);
- ret = pAssociateColorProfileWithDeviceA( "machine", testprofile, NULL );
+ ret = AssociateColorProfileWithDeviceA( "machine", testprofile, NULL );
error = GetLastError();
ok( !ret, "AssociateColorProfileWithDevice() succeeded\n" );
ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %lu\n", error );
SetLastError(0xdeadbeef);
- ret = pAssociateColorProfileWithDeviceA( "machine", NULL, monitor.DeviceID );
+ ret = AssociateColorProfileWithDeviceA( "machine", NULL, monitor.DeviceID );
error = GetLastError();
ok( !ret, "AssociateColorProfileWithDevice() succeeded\n" );
ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %lu\n", error );
SetLastError(0xdeadbeef);
- ret = pAssociateColorProfileWithDeviceA( "machine", testprofile, monitor.DeviceID );
+ ret = AssociateColorProfileWithDeviceA( "machine", testprofile, monitor.DeviceID );
error = GetLastError();
ok( !ret, "AssociateColorProfileWithDevice() succeeded\n" );
ok( error == ERROR_NOT_SUPPORTED, "expected ERROR_NOT_SUPPORTED, got %lu\n", error );
- ret = pInstallColorProfileA( NULL, testprofile );
+ ret = InstallColorProfileA( NULL, testprofile );
ok( ret, "InstallColorProfileA() failed (%lu)\n", GetLastError() );
- ret = pGetColorDirectoryA( NULL, profile, &size );
+ ret = GetColorDirectoryA( NULL, profile, &size );
ok( ret, "GetColorDirectoryA() failed (%lu)\n", GetLastError() );
MSCMS_basenameA( testprofile, basename );
lstrcatA( profile, "\\" );
lstrcatA( profile, basename );
- ret = pAssociateColorProfileWithDeviceA( NULL, profile, monitor.DeviceID );
+ ret = AssociateColorProfileWithDeviceA( NULL, profile, monitor.DeviceID );
ok( ret, "AssociateColorProfileWithDevice() failed (%lu)\n", GetLastError() );
SetLastError(0xdeadbeef);
- ret = pDisassociateColorProfileFromDeviceA( "machine", profile, NULL );
+ ret = DisassociateColorProfileFromDeviceA( "machine", profile, NULL );
error = GetLastError();
ok( !ret, "DisassociateColorProfileFromDeviceA() succeeded\n" );
ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %lu\n", error );
SetLastError(0xdeadbeef);
- ret = pDisassociateColorProfileFromDeviceA( "machine", NULL, monitor.DeviceID );
+ ret = DisassociateColorProfileFromDeviceA( "machine", NULL, monitor.DeviceID );
error = GetLastError();
ok( !ret, "DisassociateColorProfileFromDeviceA() succeeded\n" );
ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %lu\n", error );
SetLastError(0xdeadbeef);
- ret = pDisassociateColorProfileFromDeviceA( "machine", profile, monitor.DeviceID );
+ ret = DisassociateColorProfileFromDeviceA( "machine", profile, monitor.DeviceID );
error = GetLastError();
ok( !ret, "DisassociateColorProfileFromDeviceA() succeeded\n" );
ok( error == ERROR_NOT_SUPPORTED, "expected ERROR_NOT_SUPPORTED, got %lu\n", error );
- ret = pDisassociateColorProfileFromDeviceA( NULL, profile, monitor.DeviceID );
+ ret = DisassociateColorProfileFromDeviceA( NULL, profile, monitor.DeviceID );
ok( ret, "DisassociateColorProfileFromDeviceA() failed (%lu)\n", GetLastError() );
- ret = pUninstallColorProfileA( NULL, profile, TRUE );
+ ret = UninstallColorProfileA( NULL, profile, TRUE );
ok( ret, "UninstallColorProfileA() failed (%lu)\n", GetLastError() );
}
else
@@ -1321,7 +1182,7 @@ static BOOL have_profile(void)
HANDLE handle;
WIN32_FIND_DATAA data;
- if (!pGetColorDirectoryA( NULL, glob, &size )) return FALSE;
+ if (!GetColorDirectoryA( NULL, glob, &size )) return FALSE;
lstrcatA( glob, "\\*.icm" );
handle = FindFirstFileA( glob, &data );
if (handle == INVALID_HANDLE_VALUE) return FALSE;
@@ -1342,22 +1203,22 @@ static void test_CreateMultiProfileTransform( char *standardprofile, char *testp
profile.pProfileData = standardprofile;
profile.cbDataSize = strlen(standardprofile);
- handle[0] = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle[0] = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle[0] != NULL, "got %lu\n", GetLastError() );
profile.dwType = PROFILE_FILENAME;
profile.pProfileData = testprofile;
profile.cbDataSize = strlen(testprofile);
- handle[1] = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
+ handle[1] = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
ok( handle[1] != NULL, "got %lu\n", GetLastError() );
- transform = pCreateMultiProfileTransform( handle, 2, intents, 2, 0, 0 );
+ transform = CreateMultiProfileTransform( handle, 2, intents, 2, 0, 0 );
ok( transform != NULL, "got %lu\n", GetLastError() );
- pDeleteColorTransform( transform );
- pCloseColorProfile( handle[0] );
- pCloseColorProfile( handle[1] );
+ DeleteColorTransform( transform );
+ CloseColorProfile( handle[0] );
+ CloseColorProfile( handle[1] );
}
}
@@ -1380,42 +1241,42 @@ static void test_TranslateBitmapBits( char *standardprofile, char *testprofile )
profile.pProfileData = standardprofile;
profile.cbDataSize = strlen(standardprofile);
- handle[0] = pOpenColorProfileA( &profile, PROFILE_READ, 1, OPEN_EXISTING );
+ handle[0] = OpenColorProfileA( &profile, PROFILE_READ, 1, OPEN_EXISTING );
ok( handle[0] != NULL, "got %lu\n", GetLastError() );
profile.dwType = PROFILE_FILENAME;
profile.pProfileData = testprofile;
profile.cbDataSize = strlen(testprofile);
- handle[1] = pOpenColorProfileA( &profile, PROFILE_READ, 1, OPEN_EXISTING );
+ handle[1] = OpenColorProfileA( &profile, PROFILE_READ, 1, OPEN_EXISTING );
ok( handle[1] != NULL, "got %lu\n", GetLastError() );
- transform = pCreateMultiProfileTransform( handle, 2, &intent, 1, 0, 0 );
+ transform = CreateMultiProfileTransform( handle, 2, &intent, 1, 0, 0 );
ok( transform != NULL, "got %lu\n", GetLastError() );
memset( destbits, 0, sizeof(destbits) );
- ret = pTranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xBGRQUADS, 4, NULL, 0 );
+ ret = TranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xBGRQUADS, 4, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
ok( !memcmp(expect_destbits, destbits, sizeof(expect_destbits)), "unexpected destbits\n" );
memset( destbits, 0, sizeof(destbits) );
- ret = pTranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xRGBQUADS, 4, NULL, 0 );
+ ret = TranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xRGBQUADS, 4, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
ok( !memcmp(expect_destbits2, destbits, sizeof(expect_destbits2)), "unexpected destbits\n" );
memset( destbits, 0, sizeof(destbits) );
- ret = pTranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_RGBTRIPLETS, 3, NULL, 0 );
+ ret = TranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_RGBTRIPLETS, 3, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
ok( !memcmp(expect_destbits3, destbits, sizeof(expect_destbits3)), "unexpected destbits\n" );
memset( destbits, 0, sizeof(destbits) );
- ret = pTranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_BGRTRIPLETS, 3, NULL, 0 );
+ ret = TranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_BGRTRIPLETS, 3, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
ok( !memcmp(expect_destbits4, destbits, sizeof(expect_destbits4)), "unexpected destbits\n" );
- pDeleteColorTransform( transform );
- pCloseColorProfile( handle[0] );
- pCloseColorProfile( handle[1] );
+ DeleteColorTransform( transform );
+ CloseColorProfile( handle[0] );
+ CloseColorProfile( handle[1] );
}
START_TEST(profile)
@@ -1428,23 +1289,6 @@ START_TEST(profile)
WCHAR *standardprofileW = NULL, *testprofileW = NULL;
UINT ret;
- hmscms = LoadLibraryA( "mscms.dll" );
- if (!hmscms) return;
-
- huser32 = LoadLibraryA( "user32.dll" );
- if (!huser32)
- {
- FreeLibrary( hmscms );
- return;
- }
-
- if (!init_function_ptrs())
- {
- FreeLibrary( huser32 );
- FreeLibrary( hmscms );
- return;
- }
-
/* See if we can find the standard color profile */
ret = GetSystemDirectoryA( profilefile1, sizeof(profilefile1) );
ok( ret > 0, "GetSystemDirectoryA() returns %d, LastError = %lu\n", ret, GetLastError());
@@ -1531,6 +1375,4 @@ START_TEST(profile)
test_TranslateBitmapBits( standardprofile, testprofile );
if (testprofile) DeleteFileA( testprofile );
- FreeLibrary( huser32 );
- FreeLibrary( hmscms );
}
--
2.30.2
1
0
From: Zhao Yi <zhaoyi(a)uniontech.com>
Signed-off-by: Zhao Yi <zhaoyi(a)uniontech.com>
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mscms/tests/profile.c | 8 ++++----
dlls/mscms/transform.c | 10 +++++-----
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/mscms/tests/profile.c b/dlls/mscms/tests/profile.c
index 025b1531796..e5f924fb2da 100644
--- a/dlls/mscms/tests/profile.c
+++ b/dlls/mscms/tests/profile.c
@@ -1396,22 +1396,22 @@ static void test_TranslateBitmapBits( char *standardprofile, char *testprofile )
memset( destbits, 0, sizeof(destbits) );
ret = pTranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xBGRQUADS, 4, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
- todo_wine ok( !memcmp(expect_destbits, destbits, sizeof(expect_destbits)), "unexpected destbits\n" );
+ ok( !memcmp(expect_destbits, destbits, sizeof(expect_destbits)), "unexpected destbits\n" );
memset( destbits, 0, sizeof(destbits) );
ret = pTranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xRGBQUADS, 4, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
- todo_wine ok( !memcmp(expect_destbits2, destbits, sizeof(expect_destbits2)), "unexpected destbits\n" );
+ ok( !memcmp(expect_destbits2, destbits, sizeof(expect_destbits2)), "unexpected destbits\n" );
memset( destbits, 0, sizeof(destbits) );
ret = pTranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_RGBTRIPLETS, 3, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
- todo_wine ok( !memcmp(expect_destbits3, destbits, sizeof(expect_destbits3)), "unexpected destbits\n" );
+ ok( !memcmp(expect_destbits3, destbits, sizeof(expect_destbits3)), "unexpected destbits\n" );
memset( destbits, 0, sizeof(destbits) );
ret = pTranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_BGRTRIPLETS, 3, NULL, 0 );
ok( ret, "got %lu\n", GetLastError() );
- todo_wine ok( !memcmp(expect_destbits4, destbits, sizeof(expect_destbits4)), "unexpected destbits\n" );
+ ok( !memcmp(expect_destbits4, destbits, sizeof(expect_destbits4)), "unexpected destbits\n" );
pDeleteColorTransform( transform );
pCloseColorProfile( handle[0] );
diff --git a/dlls/mscms/transform.c b/dlls/mscms/transform.c
index 0d48e217d66..22901ad721c 100644
--- a/dlls/mscms/transform.c
+++ b/dlls/mscms/transform.c
@@ -39,12 +39,12 @@ static DWORD from_bmformat( BMFORMAT format )
switch (format)
{
- case BM_RGBTRIPLETS: ret = TYPE_RGB_8; break;
- case BM_BGRTRIPLETS: ret = TYPE_BGR_8; break;
+ case BM_RGBTRIPLETS: ret = TYPE_BGR_8; break;
+ case BM_BGRTRIPLETS: ret = TYPE_RGB_8; break;
case BM_GRAY: ret = TYPE_GRAY_8; break;
- case BM_xRGBQUADS: ret = TYPE_ARGB_8; break;
- case BM_xBGRQUADS: ret = TYPE_ABGR_8; break;
- case BM_KYMCQUADS: ret = TYPE_KYMC_8; break;
+ case BM_xRGBQUADS: ret = TYPE_BGRA_8; break;
+ case BM_xBGRQUADS: ret = TYPE_RGBA_8; break;
+ case BM_KYMCQUADS: ret = TYPE_CMYK_8; break;
default:
if (!quietfixme)
{
--
2.30.2
1
0
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mscms/tests/profile.c | 60 ++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/dlls/mscms/tests/profile.c b/dlls/mscms/tests/profile.c
index e0bfbd70e10..025b1531796 100644
--- a/dlls/mscms/tests/profile.c
+++ b/dlls/mscms/tests/profile.c
@@ -58,6 +58,7 @@ static BOOL (WINAPI *pSetColorProfileElement)(HPROFILE,TAGTYPE,DWORD,PDWORD,
static BOOL (WINAPI *pSetColorProfileHeader)(HPROFILE,PPROFILEHEADER);
static BOOL (WINAPI *pSetStandardColorSpaceProfileA)(PCSTR,DWORD,PSTR);
static BOOL (WINAPI *pSetStandardColorSpaceProfileW)(PCWSTR,DWORD,PWSTR);
+static BOOL (WINAPI *pTranslateBitmapBits)(HTRANSFORM,PVOID,BMFORMAT,DWORD,DWORD,DWORD,PVOID,BMFORMAT,DWORD,PBMCALLBACKFN,ULONG);
static BOOL (WINAPI *pUninstallColorProfileA)(PCSTR,PCSTR,BOOL);
static BOOL (WINAPI *pUninstallColorProfileW)(PCWSTR,PCWSTR,BOOL);
@@ -95,6 +96,7 @@ static BOOL init_function_ptrs( void )
GETFUNCPTR( SetStandardColorSpaceProfileW )
GETFUNCPTR( UninstallColorProfileA )
GETFUNCPTR( UninstallColorProfileW )
+ GETFUNCPTR( TranslateBitmapBits )
pEnumDisplayDevicesA = (void *)GetProcAddress( huser32, "EnumDisplayDevicesA" );
@@ -1359,6 +1361,63 @@ static void test_CreateMultiProfileTransform( char *standardprofile, char *testp
}
}
+static void test_TranslateBitmapBits( char *standardprofile, char *testprofile )
+{
+ PROFILE profile;
+ HPROFILE handle[2];
+ HTRANSFORM transform;
+ DWORD intent = INTENT_PERCEPTUAL;
+ BYTE srcbits[] = {0x00, 0x00, 0xff}, srcbits2[] = {0xcc, 0x00, 0x00, 0xff}, destbits[4];
+ const BYTE expect_destbits[] = {0xff, 0x00, 0x00, 0x00};
+ const BYTE expect_destbits2[] = {0x00, 0x00, 0xff, 0x00};
+ const BYTE expect_destbits3[] = {0xcc, 0x00, 0x00};
+ const BYTE expect_destbits4[] = {0x00, 0x00, 0xcc};
+ BOOL ret;
+
+ if (!standardprofile) return;
+
+ profile.dwType = PROFILE_FILENAME;
+ profile.pProfileData = standardprofile;
+ profile.cbDataSize = strlen(standardprofile);
+
+ handle[0] = pOpenColorProfileA( &profile, PROFILE_READ, 1, OPEN_EXISTING );
+ ok( handle[0] != NULL, "got %lu\n", GetLastError() );
+
+ profile.dwType = PROFILE_FILENAME;
+ profile.pProfileData = testprofile;
+ profile.cbDataSize = strlen(testprofile);
+
+ handle[1] = pOpenColorProfileA( &profile, PROFILE_READ, 1, OPEN_EXISTING );
+ ok( handle[1] != NULL, "got %lu\n", GetLastError() );
+
+ transform = pCreateMultiProfileTransform( handle, 2, &intent, 1, 0, 0 );
+ ok( transform != NULL, "got %lu\n", GetLastError() );
+
+ memset( destbits, 0, sizeof(destbits) );
+ ret = pTranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xBGRQUADS, 4, NULL, 0 );
+ ok( ret, "got %lu\n", GetLastError() );
+ todo_wine ok( !memcmp(expect_destbits, destbits, sizeof(expect_destbits)), "unexpected destbits\n" );
+
+ memset( destbits, 0, sizeof(destbits) );
+ ret = pTranslateBitmapBits( transform, srcbits, BM_RGBTRIPLETS, 1, 1, 3, destbits, BM_xRGBQUADS, 4, NULL, 0 );
+ ok( ret, "got %lu\n", GetLastError() );
+ todo_wine ok( !memcmp(expect_destbits2, destbits, sizeof(expect_destbits2)), "unexpected destbits\n" );
+
+ memset( destbits, 0, sizeof(destbits) );
+ ret = pTranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_RGBTRIPLETS, 3, NULL, 0 );
+ ok( ret, "got %lu\n", GetLastError() );
+ todo_wine ok( !memcmp(expect_destbits3, destbits, sizeof(expect_destbits3)), "unexpected destbits\n" );
+
+ memset( destbits, 0, sizeof(destbits) );
+ ret = pTranslateBitmapBits( transform, srcbits2, BM_xRGBQUADS, 1, 1, 4, destbits, BM_BGRTRIPLETS, 3, NULL, 0 );
+ ok( ret, "got %lu\n", GetLastError() );
+ todo_wine ok( !memcmp(expect_destbits4, destbits, sizeof(expect_destbits4)), "unexpected destbits\n" );
+
+ pDeleteColorTransform( transform );
+ pCloseColorProfile( handle[0] );
+ pCloseColorProfile( handle[1] );
+}
+
START_TEST(profile)
{
UINT len;
@@ -1469,6 +1528,7 @@ START_TEST(profile)
test_AssociateColorProfileWithDeviceA( testprofile );
test_CreateMultiProfileTransform( standardprofile, testprofile );
+ test_TranslateBitmapBits( standardprofile, testprofile );
if (testprofile) DeleteFileA( testprofile );
FreeLibrary( huser32 );
--
2.30.2
1
0
[PATCH 1/3] conhost: Save console settings as global defaults on first run
by Hugh McMaster 30 May '22
by Hugh McMaster 30 May '22
30 May '22
On Windows, HKCU\Console holds global default settings, while subkeys
hold any app-specific settings that differ from the defaults.
Wine's conhost.exe implementation currently saves all console settings
to an app-specific subkey on the first run, while global defaults are
only saved to HKCU\Console if the user selects 'Set Defaults' from the
pop-up menu and saves new settings. This is the opposite of console
behaviour on Windows.
Signed-off-by: Hugh McMaster <hugh.mcmaster(a)outlook.com>
---
programs/conhost/window.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/programs/conhost/window.c b/programs/conhost/window.c
index 5e8c3e15a4f..019925789fd 100644
--- a/programs/conhost/window.c
+++ b/programs/conhost/window.c
@@ -850,7 +850,7 @@ static void set_first_font( struct console *console, struct console_config *conf
if (fc.pass > 5)
ERR("Unable to find a valid console font\n");
- /* Save font configuration to the registry */
+ /* Update active configuration */
config->cell_width = console->active->font.width;
config->cell_height = console->active->font.height;
config->font_pitch_family = console->active->font.pitch_family;
@@ -858,7 +858,8 @@ static void set_first_font( struct console *console, struct console_config *conf
console->active->font.face_len * sizeof(WCHAR) );
config->face_name[console->active->font.face_len] = 0;
- save_config( console->window->config_key, config );
+ /* Save default console configuration to the registry */
+ save_config( NULL, config );
}
/* Sets the font specified in the LOGFONT as the new console font */
--
2.36.1
2
5
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mshtml/tests/misc.c | 190 +++++++++++++++++++++++++++++++++++++++
1 file changed, 190 insertions(+)
diff --git a/dlls/mshtml/tests/misc.c b/dlls/mshtml/tests/misc.c
index 1702a24c804..410d24884ee 100644
--- a/dlls/mshtml/tests/misc.c
+++ b/dlls/mshtml/tests/misc.c
@@ -24,6 +24,7 @@
#include "windef.h"
#include "winbase.h"
#include "ole2.h"
+#include "mshtml.h"
#include "initguid.h"
#include "optary.h"
@@ -106,11 +107,200 @@ static void test_HTMLLoadOptions(void)
IHtmlLoadOptions_Release(loadopts);
}
+static IHTMLDocument2 *create_doc_from_url(const WCHAR *start_url)
+{
+ BSTR url;
+ IBindCtx *bc;
+ IMoniker *url_mon;
+ IPersistMoniker *persist_mon;
+ IHTMLDocument2 *doc;
+ HRESULT hres;
+
+ hres = CreateBindCtx(0, &bc);
+ ok(hres == S_OK, "CreateBindCtx failed: 0x%08lx\n", hres);
+
+ url = SysAllocString(start_url);
+ hres = CreateURLMoniker(NULL, url, &url_mon);
+ ok(hres == S_OK, "CreateURLMoniker failed: 0x%08lx\n", hres);
+
+ hres = CoCreateInstance(&CLSID_HTMLDocument, NULL,
+ CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2,
+ (void**)&doc);
+ ok(hres == S_OK, "CoCreateInstance failed: 0x%08lx\n", hres);
+
+ hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker,
+ (void**)&persist_mon);
+ ok(hres == S_OK, "IHTMLDocument2_QueryInterface failed: 0x%08lx\n", hres);
+
+ hres = IPersistMoniker_Load(persist_mon, FALSE, url_mon, bc,
+ STGM_SHARE_EXCLUSIVE | STGM_READWRITE);
+ ok(hres == S_OK, "IPersistMoniker_Load failed: 0x%08lx\n", hres);
+
+ IPersistMoniker_Release(persist_mon);
+ IMoniker_Release(url_mon);
+ IBindCtx_Release(bc);
+ SysFreeString(url);
+ return doc;
+}
+
+static HRESULT get_localstorage(IHTMLDocument2 *doc, IHTMLStorage **storage)
+{
+ IHTMLWindow2 *window;
+ IHTMLWindow6 *window6;
+ HRESULT hres;
+
+ hres = IHTMLDocument2_get_parentWindow(doc, &window);
+ ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
+ ok(window != NULL, "window == NULL\n");
+
+ hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
+ IHTMLWindow2_Release(window);
+ if(FAILED(hres)) {
+ win_skip("IHTMLWindow6 not supported\n");
+ return hres;
+ }
+
+ hres = IHTMLWindow6_get_localStorage(window6, storage);
+ ok(hres == S_OK, "get_localStorage failed: %08lx\n", hres);
+ ok(*storage != NULL, "*storage == NULL\n");
+
+ IHTMLWindow6_Release(window6);
+ return hres;
+}
+
+static void test_HTMLStorage(void)
+{
+ IHTMLDocument2 *doc, *doc2;
+ IHTMLStorage *storage, *storage2;
+ VARIANT var;
+ BSTR key, value;
+ HRESULT hres;
+
+ doc = create_doc_from_url(L"http://www.codeweavers.com/");
+ doc2 = create_doc_from_url(L"http://www.codeweavers.com/");
+
+ hres = get_localstorage(doc, &storage);
+ ok(hres == S_OK, "got %08lx\n", hres);
+
+ hres = get_localstorage(doc2, &storage2);
+ ok(hres == S_OK, "got %08lx\n", hres);
+
+ key = SysAllocString(L"");
+ V_VT(&var) = 0xdead;
+ hres = IHTMLStorage_getItem(storage, key, &var);
+ ok(hres == S_OK, "getItem failed: %08lx\n", hres);
+ ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
+
+ key = SysAllocString(L"undefined");
+ hres = IHTMLStorage_removeItem(storage, key);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+
+ value = SysAllocString(L"null");
+ hres = IHTMLStorage_setItem(storage, key, value);
+ ok(hres == S_OK, "setItem failed: %08lx\n", hres);
+
+ V_VT(&var) = 0xdead;
+ hres = IHTMLStorage_getItem(storage, key, &var);
+ ok(hres == S_OK, "getItem failed: %08lx\n", hres);
+ ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
+ if (V_VT(&var) == VT_BSTR) ok(!wcscmp(V_BSTR(&var), L"null"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
+ hres = IHTMLStorage_removeItem(storage, key);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+ SysFreeString(key);
+ SysFreeString(value);
+
+ key = SysAllocString(L"winetest");
+ value = SysAllocString(L"winetest");
+ hres = IHTMLStorage_setItem(storage, key, value);
+ ok(hres == S_OK, "setItem failed: %08lx\n", hres);
+
+ /* retrieve value from different storage instance */
+ V_VT(&var) = 0xdead;
+ hres = IHTMLStorage_getItem(storage2, key, &var);
+ ok(hres == S_OK, "getItem failed: %08lx\n", hres);
+ ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
+ if (V_VT(&var) == VT_BSTR) ok(!wcscmp(V_BSTR(&var), L"winetest"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
+
+ hres = IHTMLStorage_removeItem(storage, key);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+
+ V_VT(&var) = 0xdead;
+ hres = IHTMLStorage_getItem(storage2, key, &var);
+ ok(hres == S_OK, "getItem failed: %08lx\n", hres);
+ ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
+ SysFreeString(key);
+ SysFreeString(value);
+
+ /* item doesn't exist */
+ key = SysAllocString(L"nosuch");
+ hres = IHTMLStorage_removeItem(storage, key);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+
+ V_VT(&var) = 0xdead;
+ hres = IHTMLStorage_getItem(storage, key, &var);
+ ok(hres == S_OK, "getItem failed: %08lx\n", hres);
+ ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
+ SysFreeString(key);
+
+ hres = IHTMLStorage_getItem(storage, NULL, NULL);
+ ok(hres == E_POINTER, "getItem returned: %08lx\n", hres);
+
+ hres = IHTMLStorage_getItem(storage, key, NULL);
+ ok(hres == E_POINTER, "getItem failed: %08lx\n", hres);
+
+ V_VT(&var) = 0xdead;
+ hres = IHTMLStorage_getItem(storage, NULL, &var);
+ ok(hres == S_OK, "getItem returned: %08lx\n", hres);
+ ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
+
+ hres = IHTMLStorage_setItem(storage, NULL, NULL);
+ ok(hres == S_OK, "setItem failed: %08lx\n", hres);
+
+ key = SysAllocString(L"winetest2");
+ hres = IHTMLStorage_setItem(storage, key, NULL);
+ ok(hres == S_OK, "setItem failed: %08lx\n", hres);
+
+ hres = IHTMLStorage_setItem(storage, NULL, key);
+ ok(hres == S_OK, "setItem failed: %08lx\n", hres);
+
+ hres = IHTMLStorage_removeItem(storage, key);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+ SysFreeString(key);
+
+ hres = IHTMLStorage_removeItem(storage, NULL);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+
+ /* Unicode characters */
+ key = SysAllocString(L"winetest");
+ value = SysAllocString(L"\x20ac");
+ hres = IHTMLStorage_setItem(storage, key, value);
+ ok(hres == S_OK, "setItem failed: %08lx\n", hres);
+ hres = IHTMLStorage_removeItem(storage, key);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+ SysFreeString(value);
+ SysFreeString(key);
+
+ key = SysAllocString(L"\x20ac");
+ value = SysAllocString(L"winetest");
+ hres = IHTMLStorage_setItem(storage, key, value);
+ ok(hres == S_OK, "setItem failed: %08lx\n", hres);
+ hres = IHTMLStorage_removeItem(storage, key);
+ ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
+ SysFreeString(value);
+ SysFreeString(key);
+
+ IHTMLStorage_Release(storage);
+ IHTMLStorage_Release(storage2);
+ IHTMLDocument2_Release(doc);
+ IHTMLDocument2_Release(doc2);
+}
+
START_TEST(misc)
{
CoInitialize(NULL);
test_HTMLLoadOptions();
+ test_HTMLStorage();
CoUninitialize();
}
--
2.30.2
2
1
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mshtml/htmlstorage.c | 56 +++++++++++++++++++++++++++++++++++++--
1 file changed, 54 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c
index f7b92114622..1983d87a296 100644
--- a/dlls/mshtml/htmlstorage.c
+++ b/dlls/mshtml/htmlstorage.c
@@ -454,11 +454,63 @@ static HRESULT WINAPI HTMLStorage_setItem(IHTMLStorage *iface, BSTR bstrKey, BST
return hres;
}
+static HRESULT remove_item(const WCHAR *filename, BSTR key)
+{
+ IXMLDOMDocument *doc;
+ IXMLDOMNode *root = NULL, *node = NULL;
+ BSTR query = NULL;
+ HRESULT hres;
+
+ hres = open_document(filename, &doc);
+ if(hres != S_OK)
+ return hres;
+
+ hres = get_root_node(doc, &root);
+ if(hres != S_OK)
+ goto done;
+
+ query = build_query(key);
+ if(!query) {
+ hres = E_OUTOFMEMORY;
+ goto done;
+ }
+
+ hres = IXMLDOMNode_selectSingleNode(root, query, &node);
+ if(hres == S_OK) {
+ hres = IXMLDOMNode_removeChild(root, node, NULL);
+ if(hres != S_OK)
+ goto done;
+ }
+
+ hres = save_document(doc, filename);
+
+done:
+ SysFreeString(query);
+ if(root)
+ IXMLDOMNode_Release(root);
+ if(node)
+ IXMLDOMNode_Release(node);
+ IXMLDOMDocument_Release(doc);
+ return hres;
+}
+
static HRESULT WINAPI HTMLStorage_removeItem(IHTMLStorage *iface, BSTR bstrKey)
{
HTMLStorage *This = impl_from_IHTMLStorage(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(bstrKey));
- return E_NOTIMPL;
+ HRESULT hres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(bstrKey));
+
+ if(!This->filename) {
+ FIXME("session storage not supported\n");
+ return E_NOTIMPL;
+ }
+
+ WaitForSingleObject(This->mutex, INFINITE);
+ hres = remove_item(This->filename, bstrKey);
+ ReleaseMutex(This->mutex);
+
+ return hres;
}
static HRESULT WINAPI HTMLStorage_clear(IHTMLStorage *iface)
--
2.30.2
2
1
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mshtml/htmlstorage.c | 113 +++++++++++++++++++++++++++++++++++++-
1 file changed, 111 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c
index 8ef92453b95..f7b92114622 100644
--- a/dlls/mshtml/htmlstorage.c
+++ b/dlls/mshtml/htmlstorage.c
@@ -338,11 +338,120 @@ static HRESULT WINAPI HTMLStorage_getItem(IHTMLStorage *iface, BSTR bstrKey, VAR
return hres;
}
+static HRESULT set_attribute(IXMLDOMElement *elem, const WCHAR *name, BSTR value)
+{
+ BSTR str;
+ VARIANT var;
+ HRESULT hres;
+
+ str = SysAllocString(name);
+ if(!str)
+ return E_OUTOFMEMORY;
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = value;
+
+ hres = IXMLDOMElement_setAttribute(elem, str, var);
+ SysFreeString(str);
+ return hres;
+}
+
+static HRESULT save_document(IXMLDOMDocument *doc, const WCHAR *filename)
+{
+ VARIANT var;
+ HRESULT hres;
+
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(filename);
+ if(!V_BSTR(&var))
+ return E_OUTOFMEMORY;
+
+ hres = IXMLDOMDocument_save(doc, var);
+ SysFreeString(V_BSTR(&var));
+ return hres;
+}
+
+static HRESULT set_item(const WCHAR *filename, BSTR key, BSTR value)
+{
+ IXMLDOMDocument *doc;
+ IXMLDOMNode *root = NULL, *node = NULL;
+ IXMLDOMElement *elem = NULL;
+ BSTR query = NULL;
+ HRESULT hres;
+
+ hres = open_document(filename, &doc);
+ if(hres != S_OK)
+ return hres;
+
+ hres = get_root_node(doc, &root);
+ if(hres != S_OK)
+ goto done;
+
+ query = build_query(key);
+ if(!query) {
+ hres = E_OUTOFMEMORY;
+ goto done;
+ }
+
+ hres = IXMLDOMNode_selectSingleNode(root, query, &node);
+ if(hres == S_OK) {
+ hres = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
+ if(hres != S_OK)
+ goto done;
+
+ hres = set_attribute(elem, L"value", value);
+ if(hres != S_OK)
+ goto done;
+ }else {
+ BSTR str = SysAllocString(L"item");
+ hres = IXMLDOMDocument_createElement(doc, str, &elem);
+ SysFreeString(str);
+ if(hres != S_OK)
+ goto done;
+
+ hres = set_attribute(elem, L"name", key);
+ if(hres != S_OK)
+ goto done;
+
+ hres = set_attribute(elem, L"value", value);
+ if(hres != S_OK)
+ goto done;
+
+ hres = IXMLDOMNode_appendChild(root, (IXMLDOMNode*)elem, NULL);
+ if(hres != S_OK)
+ goto done;
+ }
+
+ hres = save_document(doc, filename);
+
+done:
+ SysFreeString(query);
+ if(root)
+ IXMLDOMNode_Release(root);
+ if(node)
+ IXMLDOMNode_Release(node);
+ if(elem)
+ IXMLDOMElement_Release(elem);
+ IXMLDOMDocument_Release(doc);
+ return hres;
+}
+
static HRESULT WINAPI HTMLStorage_setItem(IHTMLStorage *iface, BSTR bstrKey, BSTR bstrValue)
{
HTMLStorage *This = impl_from_IHTMLStorage(iface);
- FIXME("(%p)->(%s %s)\n", This, debugstr_w(bstrKey), debugstr_w(bstrValue));
- return E_NOTIMPL;
+ HRESULT hres;
+
+ TRACE("(%p)->(%s %s)\n", This, debugstr_w(bstrKey), debugstr_w(bstrValue));
+
+ if(!This->filename) {
+ FIXME("session storage not supported\n");
+ return E_NOTIMPL;
+ }
+
+ WaitForSingleObject(This->mutex, INFINITE);
+ hres = set_item(This->filename, bstrKey, bstrValue);
+ ReleaseMutex(This->mutex);
+
+ return hres;
}
static HRESULT WINAPI HTMLStorage_removeItem(IHTMLStorage *iface, BSTR bstrKey)
--
2.30.2
3
2