mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
tests/shader_runner_metal: Create Metal vertex buffers.
This commit is contained in:
parent
6d6cd8021e
commit
f0a864c8a2
Notes:
Henri Verbeet
2024-11-20 15:00:07 +01:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1243
@ -26,10 +26,15 @@
|
|||||||
#include "vkd3d_d3dcommon.h"
|
#include "vkd3d_d3dcommon.h"
|
||||||
#undef BOOL
|
#undef BOOL
|
||||||
|
|
||||||
|
static const MTLResourceOptions DEFAULT_BUFFER_RESOURCE_OPTIONS = MTLResourceCPUCacheModeDefaultCache
|
||||||
|
| MTLResourceStorageModeShared
|
||||||
|
| MTLResourceHazardTrackingModeDefault;
|
||||||
|
|
||||||
struct metal_resource
|
struct metal_resource
|
||||||
{
|
{
|
||||||
struct resource r;
|
struct resource r;
|
||||||
|
|
||||||
|
id<MTLBuffer> buffer;
|
||||||
id<MTLTexture> texture;
|
id<MTLTexture> texture;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -107,6 +112,19 @@ static struct metal_runner *metal_runner(struct shader_runner *r)
|
|||||||
return CONTAINING_RECORD(r, struct metal_runner, r);
|
return CONTAINING_RECORD(r, struct metal_runner, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void init_resource_buffer(struct metal_runner *runner,
|
||||||
|
struct metal_resource *resource, const struct resource_params *params)
|
||||||
|
{
|
||||||
|
id<MTLDevice> device = runner->device;
|
||||||
|
|
||||||
|
if (params->data)
|
||||||
|
resource->buffer = [device newBufferWithBytes:params->data
|
||||||
|
length:params->data_size
|
||||||
|
options:DEFAULT_BUFFER_RESOURCE_OPTIONS];
|
||||||
|
else
|
||||||
|
resource->buffer = [device newBufferWithLength:params->data_size options:DEFAULT_BUFFER_RESOURCE_OPTIONS];
|
||||||
|
}
|
||||||
|
|
||||||
static void init_resource_texture(struct metal_runner *runner,
|
static void init_resource_texture(struct metal_runner *runner,
|
||||||
struct metal_resource *resource, const struct resource_params *params)
|
struct metal_resource *resource, const struct resource_params *params)
|
||||||
{
|
{
|
||||||
@ -157,7 +175,9 @@ static struct resource *metal_runner_create_resource(struct shader_runner *r, co
|
|||||||
resource = calloc(1, sizeof(*resource));
|
resource = calloc(1, sizeof(*resource));
|
||||||
init_resource(&resource->r, params);
|
init_resource(&resource->r, params);
|
||||||
|
|
||||||
if (params->desc.dimension != RESOURCE_DIMENSION_BUFFER)
|
if (params->desc.dimension == RESOURCE_DIMENSION_BUFFER)
|
||||||
|
init_resource_buffer(runner, resource, params);
|
||||||
|
else
|
||||||
init_resource_texture(runner, resource, params);
|
init_resource_texture(runner, resource, params);
|
||||||
|
|
||||||
return &resource->r;
|
return &resource->r;
|
||||||
@ -168,6 +188,7 @@ static void metal_runner_destroy_resource(struct shader_runner *r, struct resour
|
|||||||
struct metal_resource *resource = metal_resource(res);
|
struct metal_resource *resource = metal_resource(res);
|
||||||
|
|
||||||
[resource->texture release];
|
[resource->texture release];
|
||||||
|
[resource->buffer release];
|
||||||
free(resource);
|
free(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,6 +299,7 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY pr
|
|||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
id<MTLBuffer> buffer;
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
} vb_info[MAX_RESOURCES];
|
} vb_info[MAX_RESOURCES];
|
||||||
|
|
||||||
@ -303,6 +325,7 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY pr
|
|||||||
fb_height = ~0u;
|
fb_height = ~0u;
|
||||||
/* [[buffer(0)]] is used for the descriptor argument buffer. */
|
/* [[buffer(0)]] is used for the descriptor argument buffer. */
|
||||||
vb_idx = 1;
|
vb_idx = 1;
|
||||||
|
memset(vb_info, 0, sizeof(vb_info));
|
||||||
for (i = 0; i < runner->r.resource_count; ++i)
|
for (i = 0; i < runner->r.resource_count; ++i)
|
||||||
{
|
{
|
||||||
resource = metal_resource(runner->r.resources[i]);
|
resource = metal_resource(runner->r.resources[i]);
|
||||||
@ -332,6 +355,7 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY pr
|
|||||||
}
|
}
|
||||||
if (!stride)
|
if (!stride)
|
||||||
break;
|
break;
|
||||||
|
vb_info[resource->r.desc.slot].buffer = resource->buffer;
|
||||||
vb_info[resource->r.desc.slot].idx = vb_idx;
|
vb_info[resource->r.desc.slot].idx = vb_idx;
|
||||||
binding = [vertex_desc.layouts objectAtIndexedSubscript:vb_idx];
|
binding = [vertex_desc.layouts objectAtIndexedSubscript:vb_idx];
|
||||||
binding.stepFunction = MTLVertexStepFunctionPerVertex;
|
binding.stepFunction = MTLVertexStepFunctionPerVertex;
|
||||||
@ -368,6 +392,12 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY pr
|
|||||||
ok(attribute.format != MTLVertexFormatInvalid, "Unhandled attribute format %#x.\n", element->format);
|
ok(attribute.format != MTLVertexFormatInvalid, "Unhandled attribute format %#x.\n", element->format);
|
||||||
attribute.offset = attribute_offsets[i];
|
attribute.offset = attribute_offsets[i];
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < ARRAY_SIZE(vb_info); ++i)
|
||||||
|
{
|
||||||
|
if (!vb_info[i].buffer)
|
||||||
|
continue;
|
||||||
|
[encoder setVertexBuffer:vb_info[i].buffer offset:0 atIndex:vb_info[i].idx];
|
||||||
|
}
|
||||||
|
|
||||||
pipeline_desc.vertexDescriptor = vertex_desc;
|
pipeline_desc.vertexDescriptor = vertex_desc;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user