mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
tests/shader_runner_metal: Introduce a helper to encode the argument buffer.
Co-authored-by: Giovanni Mascellani <gmascellani@codeweavers.com>
This commit is contained in:
Notes:
Henri Verbeet
2025-04-14 17:16:19 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1448
@@ -319,6 +319,51 @@ static id<MTLFunction> compile_stage(struct metal_runner *runner, enum shader_ty
|
|||||||
return [function autorelease];
|
return [function autorelease];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void encode_argument_buffer(struct metal_runner *runner,
|
||||||
|
id<MTLRenderCommandEncoder> command_encoder)
|
||||||
|
{
|
||||||
|
NSMutableArray<MTLArgumentDescriptor *> *argument_descriptors;
|
||||||
|
id<MTLDevice> device = runner->device;
|
||||||
|
MTLArgumentDescriptor *arg_desc;
|
||||||
|
id<MTLArgumentEncoder> encoder;
|
||||||
|
id<MTLBuffer> argument_buffer;
|
||||||
|
|
||||||
|
argument_descriptors = [[[NSMutableArray alloc] init] autorelease];
|
||||||
|
|
||||||
|
if (runner->r.uniform_count)
|
||||||
|
{
|
||||||
|
arg_desc = [MTLArgumentDescriptor argumentDescriptor];
|
||||||
|
arg_desc.dataType = MTLDataTypePointer;
|
||||||
|
arg_desc.index = 0;
|
||||||
|
arg_desc.access = MTLBindingAccessReadOnly;
|
||||||
|
[argument_descriptors addObject:arg_desc];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (![argument_descriptors count])
|
||||||
|
return;
|
||||||
|
|
||||||
|
encoder = [[device newArgumentEncoderWithArguments:argument_descriptors] autorelease];
|
||||||
|
argument_buffer = [[device newBufferWithLength:encoder.encodedLength
|
||||||
|
options:DEFAULT_BUFFER_RESOURCE_OPTIONS] autorelease];
|
||||||
|
[encoder setArgumentBuffer:argument_buffer offset:0];
|
||||||
|
|
||||||
|
if (runner->r.uniform_count)
|
||||||
|
{
|
||||||
|
id<MTLBuffer> cb;
|
||||||
|
|
||||||
|
cb = [[device newBufferWithBytes:runner->r.uniforms
|
||||||
|
length:runner->r.uniform_count * sizeof(*runner->r.uniforms)
|
||||||
|
options:DEFAULT_BUFFER_RESOURCE_OPTIONS] autorelease];
|
||||||
|
[encoder setBuffer:cb offset:0 atIndex:0];
|
||||||
|
[command_encoder useResource:cb
|
||||||
|
usage:MTLResourceUsageRead
|
||||||
|
stages:MTLRenderStageVertex | MTLRenderStageFragment];
|
||||||
|
}
|
||||||
|
|
||||||
|
[command_encoder setVertexBuffer:argument_buffer offset:0 atIndex:0];
|
||||||
|
[command_encoder setFragmentBuffer:argument_buffer offset:0 atIndex:0];
|
||||||
|
}
|
||||||
|
|
||||||
static bool metal_runner_dispatch(struct shader_runner *r, unsigned int x, unsigned int y, unsigned int z)
|
static bool metal_runner_dispatch(struct shader_runner *r, unsigned int x, unsigned int y, unsigned int z)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -380,13 +425,9 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY to
|
|||||||
id<MTLCommandBuffer> command_buffer;
|
id<MTLCommandBuffer> command_buffer;
|
||||||
MTLDepthStencilDescriptor *ds_desc;
|
MTLDepthStencilDescriptor *ds_desc;
|
||||||
MTLRenderPassDescriptor *pass_desc;
|
MTLRenderPassDescriptor *pass_desc;
|
||||||
id<MTLArgumentEncoder> descriptors;
|
|
||||||
MTLVertexDescriptor *vertex_desc;
|
MTLVertexDescriptor *vertex_desc;
|
||||||
struct metal_resource *resource;
|
struct metal_resource *resource;
|
||||||
MTLArgumentDescriptor *cbv_desc;
|
|
||||||
id<MTLRenderPipelineState> pso;
|
id<MTLRenderPipelineState> pso;
|
||||||
id<MTLBuffer> argument_buffer;
|
|
||||||
id<MTLBuffer> cb;
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
NSError *err;
|
NSError *err;
|
||||||
|
|
||||||
@@ -482,27 +523,7 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY to
|
|||||||
command_buffer = [runner->queue commandBuffer];
|
command_buffer = [runner->queue commandBuffer];
|
||||||
encoder = [command_buffer renderCommandEncoderWithDescriptor:pass_desc];
|
encoder = [command_buffer renderCommandEncoderWithDescriptor:pass_desc];
|
||||||
|
|
||||||
if (r->uniform_count)
|
encode_argument_buffer(runner, encoder);
|
||||||
{
|
|
||||||
cb = [[device newBufferWithBytes:r->uniforms
|
|
||||||
length:runner->r.uniform_count * sizeof(*runner->r.uniforms)
|
|
||||||
options:DEFAULT_BUFFER_RESOURCE_OPTIONS] autorelease];
|
|
||||||
|
|
||||||
cbv_desc = [MTLArgumentDescriptor argumentDescriptor];
|
|
||||||
cbv_desc.dataType = MTLDataTypePointer;
|
|
||||||
cbv_desc.index = 0;
|
|
||||||
cbv_desc.access = MTLBindingAccessReadOnly;
|
|
||||||
|
|
||||||
descriptors = [[device newArgumentEncoderWithArguments:@[cbv_desc]] autorelease];
|
|
||||||
argument_buffer = [[device newBufferWithLength:descriptors.encodedLength
|
|
||||||
options:DEFAULT_BUFFER_RESOURCE_OPTIONS] autorelease];
|
|
||||||
[descriptors setArgumentBuffer:argument_buffer offset:0];
|
|
||||||
[descriptors setBuffer:cb offset:0 atIndex:0];
|
|
||||||
|
|
||||||
[encoder setVertexBuffer:argument_buffer offset:0 atIndex:0];
|
|
||||||
[encoder setFragmentBuffer:argument_buffer offset:0 atIndex:0];
|
|
||||||
[encoder useResource:cb usage:MTLResourceUsageRead stages:MTLRenderStageVertex | MTLRenderStageFragment];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (runner->r.input_element_count > 32)
|
if (runner->r.input_element_count > 32)
|
||||||
fatal_error("Unsupported input element count %zu.\n", runner->r.input_element_count);
|
fatal_error("Unsupported input element count %zu.\n", runner->r.input_element_count);
|
||||||
|
Reference in New Issue
Block a user