generate used resources

This commit is contained in:
Gregory Wells
2025-07-21 09:40:16 -04:00
parent 36cb91e147
commit 484bea4762
4 changed files with 20 additions and 6 deletions

View File

@@ -114,7 +114,7 @@ void metalDrawIndexed(gnCommandBufferHandle buffer, gnIndexType type, int indexC
void metalBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set) {
id<MTLRenderCommandEncoder> encoder = (id<MTLRenderCommandEncoder>)buffer->commandBuffer->encoder;
[encoder useResources:uniform->uniform->resources.data count:uniform->uniform->resources.count usage:MTLResourceUsageRead stages:MTLRenderStageFragment];
[encoder useResources:uniform->uniform->usedResources count:uniform->uniform->usedResourceCount usage:MTLResourceUsageRead stages:MTLRenderStageFragment];
[encoder setFragmentBuffer:uniform->uniform->argumentBuffer offset:0 atIndex:2];
// for (int i = 0; i < uniform->uniform->bindingCount; i++) {

View File

@@ -11,14 +11,15 @@ typedef struct metalUniformBinding {
} metalUniformBinding;
typedef id<MTLResource> mtlResource;
GN_ARRAY_LIST(mtlResource);
typedef struct gnPlatformUniform_t {
uint32_t index[MAX_METAL_BINDINGS];
id<MTLArgumentEncoder> encoder;
id<MTLBuffer> argumentBuffer;
mtlResourceArrayList resources;
mtlResource usedResources[MAX_METAL_BINDINGS];
int indexMap[MAX_METAL_BINDINGS];
uint32_t usedResourceCount;
} gnPlatformUniform;
void updateMetalBufferUniform(gnUniform uniform, gnBufferUniformInfo* info);

View File

@@ -20,14 +20,25 @@ void updateMetalStorageUniform(gnUniform uniform, gnStorageUniformInfo* info) {
}
void updateMetalImageUniform(gnUniform uniform, gnImageUniformInfo* info) {
printf("%p\n", info->texture->texture->texture);
// mtlResource usedResources[MAX_METAL_BINDINGS];
// uint32_t indexMap[MAX_METAL_BINDINGS];
// uint32_t usedResourceCount;
if (uniform->uniform->indexMap[info->binding] == -1) {
uniform->uniform->indexMap[info->binding] = uniform->uniform->usedResourceCount;
uniform->uniform->usedResourceCount++;
}
uniform->uniform->usedResources[uniform->uniform->indexMap[info->binding]] = info->texture->texture->texture;
[uniform->uniform->encoder setTexture:info->texture->texture->texture atIndex:uniform->uniform->index[info->binding]];
[uniform->uniform->encoder setSamplerState:info->texture->texture->sampler atIndex:uniform->uniform->index[info->binding] + 1];
uniform->uniform->resources = mtlResourceArrayListCreate();
mtlResourceArrayListAdd(&uniform->uniform->resources, info->texture->texture->texture);
// uniform->uniform->resources = mtlResourceArrayListCreate();
// mtlResourceArrayListAdd(&uniform->uniform->resources, info->texture->texture->texture);
// mtlResourceArrayListAdd(&uniform->uniform->resources, info->texture->texture->sampler);
// printf("updating metal image uniform %i\n", uniform->uniform->index[info->binding]);
// printf("binding: %i\n", info->binding);

View File

@@ -60,6 +60,8 @@ gnUniform* allocateMetalUniforms(gnUniformPool pool, const gnUniformAllocationIn
}
for (int k = 0; k < arguments.count; k++) [[arguments objectAtIndex:k] release];
for (int g = 0; g < MAX_METAL_BINDINGS; g++) uniforms[i]->uniform->indexMap[g] = -1;
}
return uniforms;
}