mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
tests/shader_runner_metal: Implement multi-sample readback.
This commit is contained in:
Notes:
Henri Verbeet
2025-06-05 16:18:57 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1537
@@ -775,16 +775,19 @@ static struct resource_readback *metal_runner_get_resource_readback(struct shade
|
|||||||
struct resource *res, unsigned int sub_resource_idx)
|
struct resource *res, unsigned int sub_resource_idx)
|
||||||
{
|
{
|
||||||
struct metal_resource *resource = metal_resource(res);
|
struct metal_resource *resource = metal_resource(res);
|
||||||
|
MTLRenderPassColorAttachmentDescriptor *attachment;
|
||||||
struct metal_runner *runner = metal_runner(r);
|
struct metal_runner *runner = metal_runner(r);
|
||||||
|
id<MTLRenderCommandEncoder> resolve;
|
||||||
id<MTLCommandBuffer> command_buffer;
|
id<MTLCommandBuffer> command_buffer;
|
||||||
struct metal_resource_readback *rb;
|
struct metal_resource_readback *rb;
|
||||||
|
MTLRenderPassDescriptor *pass_desc;
|
||||||
|
MTLTextureDescriptor *texture_desc;
|
||||||
id<MTLBlitCommandEncoder> blit;
|
id<MTLBlitCommandEncoder> blit;
|
||||||
|
id<MTLTexture> src_texture;
|
||||||
unsigned int layer, level;
|
unsigned int layer, level;
|
||||||
|
|
||||||
if (resource->r.desc.dimension != RESOURCE_DIMENSION_2D)
|
if (resource->r.desc.dimension != RESOURCE_DIMENSION_2D)
|
||||||
fatal_error("Unhandled resource dimension %#x.\n", resource->r.desc.dimension);
|
fatal_error("Unhandled resource dimension %#x.\n", resource->r.desc.dimension);
|
||||||
if (resource->r.desc.sample_count > 1)
|
|
||||||
fatal_error("Unhandled sample count %u.\n", resource->r.desc.sample_count);
|
|
||||||
|
|
||||||
rb = malloc(sizeof(*rb));
|
rb = malloc(sizeof(*rb));
|
||||||
rb->rb.width = resource->r.desc.width;
|
rb->rb.width = resource->r.desc.width;
|
||||||
@@ -801,8 +804,40 @@ static struct resource_readback *metal_runner_get_resource_readback(struct shade
|
|||||||
{
|
{
|
||||||
command_buffer = [runner->queue commandBuffer];
|
command_buffer = [runner->queue commandBuffer];
|
||||||
|
|
||||||
|
src_texture = resource->texture;
|
||||||
|
if (resource->r.desc.sample_count > 1)
|
||||||
|
{
|
||||||
|
pass_desc = [MTLRenderPassDescriptor renderPassDescriptor];
|
||||||
|
attachment = pass_desc.colorAttachments[0];
|
||||||
|
|
||||||
|
if (resource->r.desc.type != RESOURCE_TYPE_RENDER_TARGET)
|
||||||
|
fatal_error("Unhandled multi-sample resolve of resource with type %#x.\n", resource->r.desc.type);
|
||||||
|
|
||||||
|
texture_desc = [[MTLTextureDescriptor new] autorelease];
|
||||||
|
texture_desc.textureType = MTLTextureType2D;
|
||||||
|
texture_desc.pixelFormat = get_metal_pixel_format(resource->r.desc.format);
|
||||||
|
texture_desc.width = resource->r.desc.width;
|
||||||
|
texture_desc.height = resource->r.desc.height;
|
||||||
|
texture_desc.arrayLength = resource->r.desc.depth;
|
||||||
|
texture_desc.mipmapLevelCount = resource->r.desc.level_count;
|
||||||
|
texture_desc.sampleCount = 1;
|
||||||
|
texture_desc.storageMode = MTLStorageModePrivate;
|
||||||
|
texture_desc.usage = MTLTextureUsageRenderTarget;
|
||||||
|
|
||||||
|
src_texture = [[runner->device newTextureWithDescriptor:texture_desc] autorelease];
|
||||||
|
ok(src_texture, "Failed to create resolve texture.\n");
|
||||||
|
|
||||||
|
attachment.texture = resource->texture;
|
||||||
|
attachment.resolveTexture = src_texture;
|
||||||
|
attachment.loadAction = MTLLoadActionLoad;
|
||||||
|
attachment.storeAction = MTLStoreActionStoreAndMultisampleResolve;
|
||||||
|
|
||||||
|
resolve = [command_buffer renderCommandEncoderWithDescriptor:pass_desc];
|
||||||
|
[resolve endEncoding];
|
||||||
|
}
|
||||||
|
|
||||||
blit = [command_buffer blitCommandEncoder];
|
blit = [command_buffer blitCommandEncoder];
|
||||||
[blit copyFromTexture:resource->texture
|
[blit copyFromTexture:src_texture
|
||||||
sourceSlice:layer
|
sourceSlice:layer
|
||||||
sourceLevel:level
|
sourceLevel:level
|
||||||
sourceOrigin:MTLOriginMake(0, 0, 0)
|
sourceOrigin:MTLOriginMake(0, 0, 0)
|
||||||
|
Reference in New Issue
Block a user