[PATCH 3/3] wined3d: Do not emit an upload for NOOVERWRITE maps on deferred contexts.

Zebediah Figura (she/her) zfigura at codeweavers.com
Wed Sep 29 11:04:47 CDT 2021


On 9/29/21 10:48, Henri Verbeet wrote:
> On Tue, 28 Sept 2021 at 23:28, Zebediah Figura <zfigura at codeweavers.com> wrote:
>> @@ -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;
>>
> Do we need UPLOAD_BO_UPLOAD_ON_UNMAP here? It seems a little out of
> place, and wined3d_cs_exec_update_sub_resource() doesn't appear to use
> it.

No, I suppose we don't. Thinking too far ahead...

Although if we obsolesce UPLOAD_BO_UPLOAD_ON_UNMAP entirely, which is 
possible, that does mean we can't use it for deferred contexts as you 
suggest below. (And if we don't, it's mildly weird not to pass it here.)

> 
>> @@ -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;
>>       }
>>
> In some ways, it would seem nicer to store the UPLOAD_BO flags
> directly in the wined3d_deferred_upload structure, instead of deriving
> them from the stored map flags. Perhaps there are other reasons to
> store the map flags in subsequent patches though?
> 

I suppose that works. I don't think there was any other instance I had 
planned that checks the map flags for deferred contexts.



More information about the wine-devel mailing list