make dynamic uniforms work in metal (kinda)
This commit is contained in:
@@ -19,40 +19,47 @@ gnUniform* allocateMetalUniforms(gnUniformPool pool, const gnUniformAllocationIn
|
|||||||
|
|
||||||
for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) {
|
for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) {
|
||||||
gnUniformBinding binding = allocInfo.sets[i].uniformBindings[c];
|
gnUniformBinding binding = allocInfo.sets[i].uniformBindings[c];
|
||||||
if (binding.type == GN_UNIFORM_BUFFER_DESCRIPTOR ||
|
switch (binding.type) {
|
||||||
binding.type == GN_SHADER_STORE_BUFFER_DESCRIPTOR) {
|
case GN_UNIFORM_BUFFER_DESCRIPTOR:
|
||||||
MTLArgumentDescriptor* descriptor = [[MTLArgumentDescriptor alloc] init];
|
case GN_DYNAMIC_UNIFORM_BUFFER_DESCRIPTOR:
|
||||||
descriptor.dataType = MTLDataTypePointer;
|
case GN_SHADER_STORE_BUFFER_DESCRIPTOR: {
|
||||||
descriptor.index = 0;
|
MTLArgumentDescriptor* descriptor = [[MTLArgumentDescriptor alloc] init];
|
||||||
descriptor.arrayLength = 1;
|
descriptor.dataType = MTLDataTypePointer;
|
||||||
descriptor.access = MTLBindingAccessReadOnly;
|
descriptor.index = 0;
|
||||||
|
descriptor.arrayLength = 1;
|
||||||
|
descriptor.access = MTLBindingAccessReadOnly;
|
||||||
|
|
||||||
if ((binding.stage & GN_VERTEX_SHADER_MODULE) == GN_VERTEX_SHADER_MODULE) [vertexArguments addObject:descriptor];
|
if ((binding.stage & GN_VERTEX_SHADER_MODULE) == GN_VERTEX_SHADER_MODULE) [vertexArguments addObject:descriptor];
|
||||||
if ((binding.stage & GN_FRAGMENT_SHADER_MODULE) == GN_FRAGMENT_SHADER_MODULE) [fragmentArguments addObject:descriptor];
|
if ((binding.stage & GN_FRAGMENT_SHADER_MODULE) == GN_FRAGMENT_SHADER_MODULE) [fragmentArguments addObject:descriptor];
|
||||||
[totalArguments addObject:descriptor];
|
[totalArguments addObject:descriptor];
|
||||||
|
|
||||||
uniforms[i]->uniform->index[allocInfo.sets[i].uniformBindings[c].binding] = currentIndex;
|
uniforms[i]->uniform->index[allocInfo.sets[i].uniformBindings[c].binding] = currentIndex;
|
||||||
currentIndex++;
|
currentIndex++;
|
||||||
} else if (allocInfo.sets[i].uniformBindings[c].type == GN_COMBINED_IMAGE_SAMPLER_DESCRIPTOR) {
|
break;
|
||||||
MTLArgumentDescriptor* textureDescriptor = [[MTLArgumentDescriptor alloc] init];
|
}
|
||||||
textureDescriptor.dataType = MTLDataTypeTexture;
|
case GN_COMBINED_IMAGE_SAMPLER_DESCRIPTOR: {
|
||||||
textureDescriptor.index = 1;
|
MTLArgumentDescriptor* textureDescriptor = [[MTLArgumentDescriptor alloc] init];
|
||||||
textureDescriptor.arrayLength = 1;
|
textureDescriptor.dataType = MTLDataTypeTexture;
|
||||||
textureDescriptor.access = MTLBindingAccessReadOnly;
|
textureDescriptor.index = 1;
|
||||||
if ((binding.stage & GN_VERTEX_SHADER_MODULE) == GN_VERTEX_SHADER_MODULE) [vertexArguments addObject:textureDescriptor];
|
textureDescriptor.arrayLength = 1;
|
||||||
if ((binding.stage & GN_FRAGMENT_SHADER_MODULE) == GN_FRAGMENT_SHADER_MODULE) [fragmentArguments addObject:textureDescriptor];
|
textureDescriptor.access = MTLBindingAccessReadOnly;
|
||||||
[totalArguments addObject:textureDescriptor];
|
if ((binding.stage & GN_VERTEX_SHADER_MODULE) == GN_VERTEX_SHADER_MODULE) [vertexArguments addObject:textureDescriptor];
|
||||||
|
if ((binding.stage & GN_FRAGMENT_SHADER_MODULE) == GN_FRAGMENT_SHADER_MODULE) [fragmentArguments addObject:textureDescriptor];
|
||||||
|
[totalArguments addObject:textureDescriptor];
|
||||||
|
|
||||||
MTLArgumentDescriptor* samplerDescriptor = [[MTLArgumentDescriptor alloc] init];
|
MTLArgumentDescriptor* samplerDescriptor = [[MTLArgumentDescriptor alloc] init];
|
||||||
samplerDescriptor.dataType = MTLDataTypeSampler;
|
samplerDescriptor.dataType = MTLDataTypeSampler;
|
||||||
samplerDescriptor.index = 2;
|
samplerDescriptor.index = 2;
|
||||||
samplerDescriptor.arrayLength = 1;
|
samplerDescriptor.arrayLength = 1;
|
||||||
samplerDescriptor.access = MTLBindingAccessReadOnly;
|
samplerDescriptor.access = MTLBindingAccessReadOnly;
|
||||||
if ((binding.stage & GN_VERTEX_SHADER_MODULE) == GN_VERTEX_SHADER_MODULE) [vertexArguments addObject:samplerDescriptor];
|
if ((binding.stage & GN_VERTEX_SHADER_MODULE) == GN_VERTEX_SHADER_MODULE) [vertexArguments addObject:samplerDescriptor];
|
||||||
if ((binding.stage & GN_FRAGMENT_SHADER_MODULE) == GN_FRAGMENT_SHADER_MODULE) [fragmentArguments addObject:samplerDescriptor];
|
if ((binding.stage & GN_FRAGMENT_SHADER_MODULE) == GN_FRAGMENT_SHADER_MODULE) [fragmentArguments addObject:samplerDescriptor];
|
||||||
[totalArguments addObject:samplerDescriptor];
|
[totalArguments addObject:samplerDescriptor];
|
||||||
uniforms[i]->uniform->index[binding.binding] = currentIndex;
|
uniforms[i]->uniform->index[binding.binding] = currentIndex;
|
||||||
currentIndex += 2;
|
currentIndex += 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GN_UNIFORM_TYPE_MAX: break;
|
||||||
}
|
}
|
||||||
uniforms[i]->uniform->stageUsed[binding.binding] = binding.stage;
|
uniforms[i]->uniform->stageUsed[binding.binding] = binding.stage;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user