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) {
|
void metalBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set) {
|
||||||
id<MTLRenderCommandEncoder> encoder = (id<MTLRenderCommandEncoder>)buffer->commandBuffer->encoder;
|
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];
|
[encoder setFragmentBuffer:uniform->uniform->argumentBuffer offset:0 atIndex:2];
|
||||||
|
|
||||||
// for (int i = 0; i < uniform->uniform->bindingCount; i++) {
|
// for (int i = 0; i < uniform->uniform->bindingCount; i++) {
|
||||||
|
@@ -11,14 +11,15 @@ typedef struct metalUniformBinding {
|
|||||||
} metalUniformBinding;
|
} metalUniformBinding;
|
||||||
|
|
||||||
typedef id<MTLResource> mtlResource;
|
typedef id<MTLResource> mtlResource;
|
||||||
GN_ARRAY_LIST(mtlResource);
|
|
||||||
|
|
||||||
typedef struct gnPlatformUniform_t {
|
typedef struct gnPlatformUniform_t {
|
||||||
uint32_t index[MAX_METAL_BINDINGS];
|
uint32_t index[MAX_METAL_BINDINGS];
|
||||||
id<MTLArgumentEncoder> encoder;
|
id<MTLArgumentEncoder> encoder;
|
||||||
id<MTLBuffer> argumentBuffer;
|
id<MTLBuffer> argumentBuffer;
|
||||||
|
|
||||||
mtlResourceArrayList resources;
|
mtlResource usedResources[MAX_METAL_BINDINGS];
|
||||||
|
int indexMap[MAX_METAL_BINDINGS];
|
||||||
|
uint32_t usedResourceCount;
|
||||||
} gnPlatformUniform;
|
} gnPlatformUniform;
|
||||||
|
|
||||||
void updateMetalBufferUniform(gnUniform uniform, gnBufferUniformInfo* info);
|
void updateMetalBufferUniform(gnUniform uniform, gnBufferUniformInfo* info);
|
||||||
|
@@ -20,14 +20,25 @@ void updateMetalStorageUniform(gnUniform uniform, gnStorageUniformInfo* info) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateMetalImageUniform(gnUniform uniform, gnImageUniformInfo* 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 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->encoder setSamplerState:info->texture->texture->sampler atIndex:uniform->uniform->index[info->binding] + 1];
|
||||||
|
|
||||||
uniform->uniform->resources = mtlResourceArrayListCreate();
|
// uniform->uniform->resources = mtlResourceArrayListCreate();
|
||||||
mtlResourceArrayListAdd(&uniform->uniform->resources, info->texture->texture->texture);
|
// mtlResourceArrayListAdd(&uniform->uniform->resources, info->texture->texture->texture);
|
||||||
// mtlResourceArrayListAdd(&uniform->uniform->resources, info->texture->texture->sampler);
|
// mtlResourceArrayListAdd(&uniform->uniform->resources, info->texture->texture->sampler);
|
||||||
|
|
||||||
|
|
||||||
// printf("updating metal image uniform %i\n", uniform->uniform->index[info->binding]);
|
// printf("updating metal image uniform %i\n", uniform->uniform->index[info->binding]);
|
||||||
|
|
||||||
// printf("binding: %i\n", 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 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;
|
return uniforms;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user