Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/cs.c | 20 ++++++++++++++------ dlls/wined3d/wined3d_private.h | 3 +++ 2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 41491c768cf..5944f7e6a91 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -34,6 +34,7 @@ struct wined3d_deferred_upload unsigned int sub_resource_idx; uint8_t *sysmem; struct wined3d_box box; + uint32_t map_flags; };
struct wined3d_command_list @@ -2429,9 +2430,9 @@ static void wined3d_device_context_upload_bo(struct wined3d_device_context *cont { struct wined3d_cs_update_sub_resource *op;
- TRACE("context %p, resource %p, sub_resource_idx %u, box %s, bo %s, row_pitch %u, slice_pitch %u.\n", + TRACE("context %p, resource %p, sub_resource_idx %u, box %s, bo %s, flags %#x, row_pitch %u, slice_pitch %u.\n", context, resource, sub_resource_idx, debug_box(box), - debug_const_bo_address(&bo->addr), row_pitch, slice_pitch); + debug_const_bo_address(&bo->addr), bo->flags, row_pitch, slice_pitch);
op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); op->opcode = WINED3D_CS_OP_UPDATE_SUB_RESOURCE; @@ -2518,7 +2519,8 @@ HRESULT wined3d_device_context_emit_unmap(struct wined3d_device_context *context unsigned int row_pitch, slice_pitch;
wined3d_resource_get_sub_resource_map_pitch(resource, sub_resource_idx, &row_pitch, &slice_pitch); - wined3d_device_context_upload_bo(context, resource, sub_resource_idx, &box, &bo, row_pitch, slice_pitch); + if (bo.flags & UPLOAD_BO_UPLOAD_ON_UNMAP) + wined3d_device_context_upload_bo(context, resource, sub_resource_idx, &box, &bo, row_pitch, slice_pitch); return WINED3D_OK; }
@@ -2749,6 +2751,7 @@ void wined3d_device_context_emit_update_sub_resource(struct wined3d_device_conte op->box = *box; op->bo.addr.buffer_object = 0; op->bo.addr.addr = data; + op->bo.flags = UPLOAD_BO_UPLOAD_ON_UNMAP; op->row_pitch = row_pitch; op->slice_pitch = slice_pitch;
@@ -3475,7 +3478,7 @@ static void wined3d_deferred_context_push_constants(struct wined3d_device_contex FIXME("context %p, p %#x, start_idx %u, count %u, constants %p, stub!\n", context, p, start_idx, count, constants); }
-static const struct wined3d_deferred_upload *deferred_context_get_upload(struct wined3d_deferred_context *deferred, +static struct wined3d_deferred_upload *deferred_context_get_upload(struct wined3d_deferred_context *deferred, struct wined3d_resource *resource, unsigned int sub_resource_idx) { SIZE_T i = deferred->upload_count; @@ -3519,13 +3522,13 @@ static void *wined3d_deferred_context_prepare_upload_bo(struct wined3d_device_co
if (flags & WINED3D_MAP_NOOVERWRITE) { - const struct wined3d_deferred_upload *upload; - if ((upload = deferred_context_get_upload(deferred, resource, sub_resource_idx))) { + upload->map_flags = flags; map_ptr = (uint8_t *)align((size_t)upload->sysmem, RESOURCE_ALIGNMENT); bo->addr.buffer_object = 0; bo->addr.addr = map_ptr; + bo->flags = 0; return map_ptr; }
@@ -3540,6 +3543,7 @@ static void *wined3d_deferred_context_prepare_upload_bo(struct wined3d_device_co return NULL;
upload = &deferred->uploads[deferred->upload_count++]; + upload->map_flags = flags; upload->resource = resource; wined3d_resource_incref(resource); upload->sub_resource_idx = sub_resource_idx; @@ -3549,6 +3553,7 @@ static void *wined3d_deferred_context_prepare_upload_bo(struct wined3d_device_co bo->addr.buffer_object = 0; map_ptr = (uint8_t *)align((size_t)sysmem, RESOURCE_ALIGNMENT); bo->addr.addr = map_ptr; + bo->flags = UPLOAD_BO_UPLOAD_ON_UNMAP; return map_ptr; }
@@ -3563,6 +3568,9 @@ static bool wined3d_deferred_context_get_upload_bo(struct wined3d_device_context *box = upload->box; bo->addr.buffer_object = 0; bo->addr.addr = (uint8_t *)align((size_t)upload->sysmem, RESOURCE_ALIGNMENT); + bo->flags = 0; + if (!(upload->map_flags & WINED3D_MAP_NOOVERWRITE)) + bo->flags |= UPLOAD_BO_UPLOAD_ON_UNMAP; return true; }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index c801e5b3ce8..520eb968eb6 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3324,9 +3324,12 @@ bool wined3d_driver_info_init(struct wined3d_driver_info *driver_info, const struct wined3d_gpu_description *gpu_description, enum wined3d_feature_level feature_level, UINT64 vram_bytes, UINT64 sysmem_bytes) DECLSPEC_HIDDEN;
+#define UPLOAD_BO_UPLOAD_ON_UNMAP 0x1 + struct upload_bo { struct wined3d_const_bo_address addr; + uint32_t flags; };
struct wined3d_adapter_ops