From 2bc6941ab06bc5243eb77a5bcf26d482a58c40ba Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 23 Sep 2019 14:54:15 +0330 Subject: [PATCH] wined3d: Derive the GL bind point for buffer object maps from the bind flags. Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/adapter_gl.c | 20 ++++++++++++++++---- dlls/wined3d/adapter_vk.c | 4 ++-- dlls/wined3d/buffer.c | 8 +++++--- dlls/wined3d/directx.c | 4 ++-- dlls/wined3d/surface.c | 23 +++++++++++------------ dlls/wined3d/texture.c | 10 ++++------ dlls/wined3d/wined3d_private.h | 14 ++++++++------ 7 files changed, 48 insertions(+), 35 deletions(-) diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 0415099439c..5ffa6fdff6f 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -4588,15 +4588,27 @@ static void adapter_gl_uninit_3d(struct wined3d_device *device) } static void *adapter_gl_map_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, size_t size, GLenum binding, uint32_t flags) + const struct wined3d_bo_address *data, size_t size, uint32_t bind_flags, uint32_t map_flags) { - return wined3d_context_gl_map_bo_address(wined3d_context_gl(context), data, size, binding, flags); + struct wined3d_context_gl *context_gl; + GLenum binding; + + context_gl = wined3d_context_gl(context); + binding = wined3d_buffer_gl_binding_from_bind_flags(context_gl->gl_info, bind_flags); + + return wined3d_context_gl_map_bo_address(context_gl, data, size, binding, map_flags); } static void adapter_gl_unmap_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, GLenum binding) + const struct wined3d_bo_address *data, uint32_t bind_flags) { - return wined3d_context_gl_unmap_bo_address(wined3d_context_gl(context), data, binding); + struct wined3d_context_gl *context_gl; + GLenum binding; + + context_gl = wined3d_context_gl(context); + binding = wined3d_buffer_gl_binding_from_bind_flags(context_gl->gl_info, bind_flags); + + wined3d_context_gl_unmap_bo_address(context_gl, data, binding); } static HRESULT adapter_gl_create_swapchain(struct wined3d_device *device, struct wined3d_swapchain_desc *desc, diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index ef2734f0551..3480cf80d91 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -472,7 +472,7 @@ static void adapter_vk_uninit_3d(struct wined3d_device *device) } static void *adapter_vk_map_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, size_t size, GLenum binding, uint32_t flags) + const struct wined3d_bo_address *data, size_t size, uint32_t bind_flags, uint32_t map_flags) { if (data->buffer_object) { @@ -484,7 +484,7 @@ static void *adapter_vk_map_bo_address(struct wined3d_context *context, } static void adapter_vk_unmap_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, GLenum binding) + const struct wined3d_bo_address *data, uint32_t bind_flags) { if (data->buffer_object) ERR("Unsupported buffer object %#lx.\n", data->buffer_object); diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 8d72b782dfa..c7be6510993 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -1288,9 +1288,11 @@ static const struct wined3d_resource_ops buffer_resource_ops = buffer_resource_sub_resource_unmap, }; -static GLenum buffer_type_hint_from_bind_flags(const struct wined3d_gl_info *gl_info, - unsigned int bind_flags) +GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *gl_info, uint32_t bind_flags) { + if (!bind_flags) + return GL_PIXEL_UNPACK_BUFFER; + if (bind_flags == WINED3D_BIND_INDEX_BUFFER) return GL_ELEMENT_ARRAY_BUFFER; @@ -1536,7 +1538,7 @@ HRESULT wined3d_buffer_gl_init(struct wined3d_buffer_gl *buffer_gl, struct wined TRACE("buffer_gl %p, device %p, desc %p, data %p, parent %p, parent_ops %p.\n", buffer_gl, device, desc, data, parent, parent_ops); - buffer_gl->buffer_type_hint = buffer_type_hint_from_bind_flags(gl_info, desc->bind_flags); + buffer_gl->buffer_type_hint = wined3d_buffer_gl_binding_from_bind_flags(gl_info, desc->bind_flags); return wined3d_buffer_init(&buffer_gl->b, device, desc, data, parent, parent_ops, &wined3d_buffer_gl_ops); } diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 8cb83ee884c..27898b8a112 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2354,7 +2354,7 @@ static void adapter_no3d_uninit_3d(struct wined3d_device *device) } static void *adapter_no3d_map_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, size_t size, GLenum binding, uint32_t flags) + const struct wined3d_bo_address *data, size_t size, uint32_t bind_flags, uint32_t map_flags) { if (data->buffer_object) { @@ -2366,7 +2366,7 @@ static void *adapter_no3d_map_bo_address(struct wined3d_context *context, } static void adapter_no3d_unmap_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, GLenum binding) + const struct wined3d_bo_address *data, uint32_t bind_flags) { if (data->buffer_object) ERR("Unsupported buffer object %#lx.\n", data->buffer_object); diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 4a3ecf9863a..ded5b53c852 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -658,15 +658,15 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr wined3d_texture_get_memory(dst_texture, 0, &dst_data, map_binding); src = wined3d_context_map_bo_address(context, &src_data, - src_texture->sub_resources[sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ); + src_texture->sub_resources[sub_resource_idx].size, 0, WINED3D_MAP_READ); dst = wined3d_context_map_bo_address(context, &dst_data, - dst_texture->sub_resources[0].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE); + dst_texture->sub_resources[0].size, 0, WINED3D_MAP_WRITE); conv->convert(src, dst, src_row_pitch, dst_row_pitch, desc.width, desc.height); wined3d_texture_invalidate_location(dst_texture, 0, ~map_binding); - wined3d_context_unmap_bo_address(context, &dst_data, GL_PIXEL_UNPACK_BUFFER); - wined3d_context_unmap_bo_address(context, &src_data, GL_PIXEL_UNPACK_BUFFER); + wined3d_context_unmap_bo_address(context, &dst_data, 0); + wined3d_context_unmap_bo_address(context, &src_data, 0); } else { @@ -1662,8 +1662,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int wined3d_texture_get_pitch(dst_texture, texture_level, &dst_map.row_pitch, &dst_map.slice_pitch); wined3d_texture_get_memory(dst_texture, dst_sub_resource_idx, &dst_data, map_binding); dst_map.data = wined3d_context_map_bo_address(context, &dst_data, - dst_texture->sub_resources[dst_sub_resource_idx].size, - GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ | WINED3D_MAP_WRITE); + dst_texture->sub_resources[dst_sub_resource_idx].size, 0, WINED3D_MAP_READ | WINED3D_MAP_WRITE); src_map = dst_map; src_format = dst_texture->resource.format; @@ -1698,7 +1697,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int wined3d_texture_get_pitch(src_texture, texture_level, &src_map.row_pitch, &src_map.slice_pitch); wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &src_data, map_binding); src_map.data = wined3d_context_map_bo_address(context, &src_data, - src_texture->sub_resources[src_sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ); + src_texture->sub_resources[src_sub_resource_idx].size, 0, WINED3D_MAP_READ); map_binding = dst_texture->resource.map_binding; texture_level = dst_sub_resource_idx % dst_texture->level_count; @@ -1708,7 +1707,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int wined3d_texture_get_pitch(dst_texture, texture_level, &dst_map.row_pitch, &dst_map.slice_pitch); wined3d_texture_get_memory(dst_texture, dst_sub_resource_idx, &dst_data, map_binding); dst_map.data = wined3d_context_map_bo_address(context, &dst_data, - dst_texture->sub_resources[dst_sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE); + dst_texture->sub_resources[dst_sub_resource_idx].size, 0, WINED3D_MAP_WRITE); } flags &= ~WINED3D_BLT_RAW; @@ -2084,9 +2083,9 @@ error: FIXME(" Unsupported flags %#x.\n", flags); release: - wined3d_context_unmap_bo_address(context, &dst_data, GL_PIXEL_UNPACK_BUFFER); + wined3d_context_unmap_bo_address(context, &dst_data, 0); if (!same_sub_resource) - wined3d_context_unmap_bo_address(context, &src_data, GL_PIXEL_UNPACK_BUFFER); + wined3d_context_unmap_bo_address(context, &src_data, 0); if (SUCCEEDED(hr) && dst_texture->swapchain && dst_texture->swapchain->front_buffer == dst_texture) { SetRect(&dst_texture->swapchain->front_buffer_update, @@ -2157,7 +2156,7 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view, wined3d_texture_get_pitch(texture, level, &map.row_pitch, &map.slice_pitch); wined3d_texture_get_memory(texture, view->sub_resource_idx, &data, map_binding); map.data = wined3d_context_map_bo_address(context, &data, - texture->sub_resources[view->sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE); + texture->sub_resources[view->sub_resource_idx].size, 0, WINED3D_MAP_WRITE); map.data = (BYTE *)map.data + (box->front * map.slice_pitch) + ((box->top / view->format->block_height) * map.row_pitch) @@ -2217,7 +2216,7 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view, memcpy(dst, map.data, w * h * bpp); } - wined3d_context_unmap_bo_address(context, &data, GL_PIXEL_UNPACK_BUFFER); + wined3d_context_unmap_bo_address(context, &data, 0); context_release(context); } diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 380aff5016f..7bb0dd0a10d 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -749,8 +749,7 @@ static void wined3d_texture_create_dc(void *object) if (!context) context = context_acquire(device, NULL, 0); desc.pMemory = wined3d_context_map_bo_address(context, &data, - texture->sub_resources[sub_resource_idx].size, - GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ | WINED3D_MAP_WRITE); + texture->sub_resources[sub_resource_idx].size, 0, WINED3D_MAP_READ | WINED3D_MAP_WRITE); } else { @@ -818,7 +817,7 @@ static void wined3d_texture_destroy_dc(void *object) if (data.buffer_object) { context = context_acquire(device, NULL, 0); - wined3d_context_unmap_bo_address(context, &data, GL_PIXEL_UNPACK_BUFFER); + wined3d_context_unmap_bo_address(context, &data, 0); context_release(context); } } @@ -2962,8 +2961,7 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour wined3d_texture_invalidate_location(texture, sub_resource_idx, ~resource->map_binding); wined3d_texture_get_memory(texture, sub_resource_idx, &data, resource->map_binding); - base_memory = wined3d_context_map_bo_address(context, &data, - sub_resource->size, GL_PIXEL_UNPACK_BUFFER, flags); + base_memory = wined3d_context_map_bo_address(context, &data, sub_resource->size, 0, flags); TRACE("Base memory pointer %p.\n", base_memory); context_release(context); @@ -3047,7 +3045,7 @@ static HRESULT texture_resource_sub_resource_unmap(struct wined3d_resource *reso context = context_acquire(device, NULL, 0); wined3d_texture_get_memory(texture, sub_resource_idx, &data, texture->resource.map_binding); - wined3d_context_unmap_bo_address(context, &data, GL_PIXEL_UNPACK_BUFFER); + wined3d_context_unmap_bo_address(context, &data, 0); context_release(context); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 58977f8cd12..3dc54696812 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2812,9 +2812,9 @@ struct wined3d_adapter_ops HRESULT (*adapter_init_3d)(struct wined3d_device *device); void (*adapter_uninit_3d)(struct wined3d_device *device); void *(*adapter_map_bo_address)(struct wined3d_context *context, - const struct wined3d_bo_address *data, size_t size, GLenum binding, uint32_t flags); + const struct wined3d_bo_address *data, size_t size, uint32_t bind_flags, uint32_t map_flags); void (*adapter_unmap_bo_address)(struct wined3d_context *context, - const struct wined3d_bo_address *data, GLenum binding); + const struct wined3d_bo_address *data, uint32_t bind_flags); HRESULT (*adapter_create_swapchain)(struct wined3d_device *device, struct wined3d_swapchain_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain); void (*adapter_destroy_swapchain)(struct wined3d_swapchain *swapchain); @@ -4225,6 +4225,8 @@ static inline struct wined3d_buffer_gl *wined3d_buffer_gl(struct wined3d_buffer return CONTAINING_RECORD(buffer, struct wined3d_buffer_gl, b); } +GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *gl_info, + uint32_t bind_flags) DECLSPEC_HIDDEN; void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *buffer_gl, struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN; HRESULT wined3d_buffer_gl_init(struct wined3d_buffer_gl *buffer_gl, struct wined3d_device *device, @@ -5250,15 +5252,15 @@ static inline float wined3d_get_float_state(const struct wined3d_state *state, e } static inline void *wined3d_context_map_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, size_t size, GLenum binding, uint32_t flags) + const struct wined3d_bo_address *data, size_t size, uint32_t bind_flags, uint32_t map_flags) { - return context->device->adapter->adapter_ops->adapter_map_bo_address(context, data, size, binding, flags); + return context->device->adapter->adapter_ops->adapter_map_bo_address(context, data, size, bind_flags, map_flags); } static inline void wined3d_context_unmap_bo_address(struct wined3d_context *context, - const struct wined3d_bo_address *data, GLenum binding) + const struct wined3d_bo_address *data, uint32_t bind_flags) { - return context->device->adapter->adapter_ops->adapter_unmap_bo_address(context, data, binding); + context->device->adapter->adapter_ops->adapter_unmap_bo_address(context, data, bind_flags); } /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */