generate used resources
This commit is contained in:
@@ -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++) {
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user