diff --git a/base/sources/backends/direct3d12_gpu.c b/base/sources/backends/direct3d12_gpu.c index 05081cad..3edb2fc7 100644 --- a/base/sources/backends/direct3d12_gpu.c +++ b/base/sources/backends/direct3d12_gpu.c @@ -995,59 +995,8 @@ void iron_gpu_pipeline_destroy(iron_gpu_pipeline_t *pipe) { } } -static ShaderConstant findConstant(iron_gpu_shader_t *shader, const char *name) { - if (shader != NULL) { - for (int i = 0; i < MAX_SHADER_THING; ++i) { - if (strcmp(shader->impl.constants[i].name, name) == 0) { - return shader->impl.constants[i]; - } - } - } - - ShaderConstant constant; - constant.name[0] = 0; - constant.offset = -1; - return constant; -} - -static ShaderTexture findTexture(iron_gpu_shader_t *shader, const char *name) { - for (int i = 0; i < MAX_SHADER_THING; ++i) { - if (strcmp(shader->impl.textures[i].name, name) == 0) { - return shader->impl.textures[i]; - } - } - - ShaderTexture texture; - texture.name[0] = 0; - texture.texture = -1; - return texture; -} - -static ShaderAttribute findAttribute(iron_gpu_shader_t *shader, const char *name) { - for (int i = 0; i < MAX_SHADER_THING; ++i) { - if (strcmp(shader->impl.attributes[i].name, name) == 0) { - return shader->impl.attributes[i]; - } - } - - ShaderAttribute attribute; - attribute.name[0] = 0; - attribute.attribute = -1; - return attribute; -} - iron_gpu_constant_location_t iron_gpu_pipeline_get_constant_location(struct iron_gpu_pipeline *pipe, const char *name) { iron_gpu_constant_location_t location; - - { - ShaderConstant constant = findConstant(pipe->vertex_shader, name); - location.impl.vertexOffset = constant.offset; - } - { - ShaderConstant constant = findConstant(pipe->fragment_shader, name); - location.impl.fragmentOffset = constant.offset; - } - return location; } @@ -1056,15 +1005,6 @@ iron_gpu_texture_unit_t iron_gpu_pipeline_get_texture_unit(iron_gpu_pipeline_t * for (int i = 0; i < IRON_GPU_SHADER_TYPE_COUNT; ++i) { unit.stages[i] = -1; } - - ShaderTexture vertexTexture = findTexture(pipe->vertex_shader, name); - if (vertexTexture.texture != -1) { - unit.stages[IRON_GPU_SHADER_TYPE_VERTEX] = vertexTexture.texture; - } - else { - ShaderTexture fragmentTexture = findTexture(pipe->fragment_shader, name); - unit.stages[IRON_GPU_SHADER_TYPE_FRAGMENT] = fragmentTexture.texture; - } return unit; } @@ -1092,12 +1032,7 @@ void iron_gpu_pipeline_compile(iron_gpu_pipeline_t *pipe) { for (int i = 0; i < pipe->input_layout->size; ++i) { vertexDesc[i].SemanticName = "TEXCOORD"; - vertexDesc[i].SemanticIndex = findAttribute(pipe->vertex_shader, pipe->input_layout->elements[i].name).attribute; - - if (pipe->kong) { - vertexDesc[i].SemanticIndex = i; - } - + vertexDesc[i].SemanticIndex = i; vertexDesc[i].InputSlot = 0; vertexDesc[i].AlignedByteOffset = (i == 0) ? 0 : D3D12_APPEND_ALIGNED_ELEMENT; vertexDesc[i].InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA; @@ -1250,55 +1185,10 @@ void iron_gpu_shader_init(iron_gpu_shader_t *shader, const void *_data, size_t l memset(shader->impl.attributes, 0, sizeof(shader->impl.attributes)); memset(shader->impl.textures, 0, sizeof(shader->impl.textures)); - unsigned index = 0; uint8_t *data = (uint8_t *)_data; - - int attributesCount = data[index++]; - for (int i = 0; i < attributesCount; ++i) { - char name[64]; - for (unsigned i2 = 0; i2 < 63; ++i2) { - name[i2] = data[index++]; - if (name[i2] == 0) - break; - } - strcpy(shader->impl.attributes[i].name, name); - shader->impl.attributes[i].attribute = data[index++]; - } - - uint8_t texCount = data[index++]; - for (unsigned i = 0; i < texCount; ++i) { - char name[64]; - for (unsigned i2 = 0; i2 < 63; ++i2) { - name[i2] = data[index++]; - if (name[i2] == 0) - break; - } - strcpy(shader->impl.textures[i].name, name); - shader->impl.textures[i].texture = data[index++]; - } - shader->impl.texturesCount = texCount; - - uint8_t constantCount = data[index++]; - for (unsigned i = 0; i < constantCount; ++i) { - char name[64]; - for (unsigned i2 = 0; i2 < 63; ++i2) { - name[i2] = data[index++]; - if (name[i2] == 0) - break; - } - ShaderConstant constant; - memcpy(&constant.offset, &data[index], sizeof(constant.offset)); - index += 4; - // memcpy(&constant.size, &data[index], sizeof(constant.size)); - index += 4; - index += 2; // columns and rows - strcpy(constant.name, name); - shader->impl.constants[i] = constant; - } - - shader->impl.length = (int)length - index; + shader->impl.length = (int)length; shader->impl.data = (uint8_t *)malloc(shader->impl.length); - memcpy(shader->impl.data, &data[index], shader->impl.length); + memcpy(shader->impl.data, data, shader->impl.length); } void iron_gpu_shader_destroy(iron_gpu_shader_t *shader) { @@ -2033,13 +1923,13 @@ void iron_gpu_index_buffer_init(iron_gpu_buffer_t *buffer, int count, bool gpuMe } void iron_gpu_index_buffer_destroy(iron_gpu_buffer_t *buffer) { - if (buffer->impl.index_buffer != NULL) { - buffer->impl.index_buffer->lpVtbl->Release(buffer->impl.index_buffer); - buffer->impl.index_buffer = NULL; - } + // if (buffer->impl.index_buffer != NULL) { + // buffer->impl.index_buffer->lpVtbl->Release(buffer->impl.index_buffer); + // buffer->impl.index_buffer = NULL; + // } - buffer->impl.upload_buffer->lpVtbl->Release(buffer->impl.upload_buffer); - buffer->impl.upload_buffer = NULL; + // buffer->impl.upload_buffer->lpVtbl->Release(buffer->impl.upload_buffer); + // buffer->impl.upload_buffer = NULL; } static int iron_gpu_internal_index_buffer_stride(iron_gpu_buffer_t *buffer) { diff --git a/base/sources/iron.h b/base/sources/iron.h index efb31593..bd64f145 100644 --- a/base/sources/iron.h +++ b/base/sources/iron.h @@ -976,17 +976,6 @@ iron_gpu_shader_t *gpu_create_shader(buffer_t *data, i32 shader_type) { return shader; } -static void write_attrib(char *file, int *output_len, const char *attrib, int index) { - if (index > -1) { - strcpy(file + (*output_len), attrib); - (*output_len) += strlen(attrib); - file[(*output_len)] = 0; - (*output_len) += 1; - file[(*output_len)] = index; - (*output_len) += 1; - } -} - #include "../../sources/libs/kong/analyzer.h" #include "../../sources/libs/kong/compiler.h" #include "../../sources/libs/kong/disasm.h" @@ -1058,114 +1047,10 @@ iron_gpu_shader_t *gpu_create_shader_from_source(string_t *source, iron_gpu_shad return NULL; } - ID3D11ShaderReflection *reflector = NULL; - D3DReflect(shader_buffer->lpVtbl->GetBufferPointer(shader_buffer), shader_buffer->lpVtbl->GetBufferSize(shader_buffer), &IID_ID3D11ShaderReflection, (void **)&reflector); - int size = shader_buffer->lpVtbl->GetBufferSize(shader_buffer); - char *file = malloc(size * 2); - int output_len = 0; - - if (shader_type == IRON_GPU_SHADER_TYPE_VERTEX) { - - bool has_col = strstr(temp_string_s, " col:") != NULL || strstr(temp_string_s, " col :") != NULL; - bool has_nor = strstr(temp_string_s, " nor:") != NULL || strstr(temp_string_s, " nor :") != NULL; - bool has_pos = strstr(temp_string_s, " pos:") != NULL || strstr(temp_string_s, " pos :") != NULL; - bool has_tex = strstr(temp_string_s, " tex:") != NULL || strstr(temp_string_s, " tex :") != NULL; - - int icol = -1; - int inor = -1; - int ipos = -1; - int itex = -1; - - int index = 0; - if (has_col) icol = index++; - if (has_nor) inor = index++; - if (has_pos) ipos = index++; - if (has_tex) itex = index++; - - file[output_len] = (char)index; - output_len += 1; - - write_attrib(file, &output_len, "col", icol); - write_attrib(file, &output_len, "nor", inor); - write_attrib(file, &output_len, "pos", ipos); - write_attrib(file, &output_len, "tex", itex); - } - else { - file[output_len] = 0; - output_len += 1; - } - - D3D11_SHADER_DESC desc; - reflector->lpVtbl->GetDesc(reflector, &desc); - - file[output_len] = desc.BoundResources; - output_len += 1; - for (int i = 0; i < desc.BoundResources; ++i) { - D3D11_SHADER_INPUT_BIND_DESC bindDesc; - reflector->lpVtbl->GetResourceBindingDesc(reflector, i, &bindDesc); - strcpy(file + output_len, bindDesc.Name); - output_len += strlen(bindDesc.Name); - file[output_len] = 0; - output_len += 1; - file[output_len] = bindDesc.BindPoint; - output_len += 1; - } - - ID3D11ShaderReflectionConstantBuffer *constants = reflector->lpVtbl->GetConstantBufferByName(reflector, "$Globals"); - D3D11_SHADER_BUFFER_DESC buffer_desc; - hr = constants->lpVtbl->GetDesc(constants, &buffer_desc); - if (hr == S_OK) { - file[output_len] = buffer_desc.Variables; - output_len += 1; - for (int i = 0; i < buffer_desc.Variables; ++i) { - ID3D11ShaderReflectionVariable *variable = constants->lpVtbl->GetVariableByIndex(constants, i); - D3D11_SHADER_VARIABLE_DESC variable_desc; - hr = variable->lpVtbl->GetDesc(variable, &variable_desc); - if (hr == S_OK) { - strcpy(file + output_len, variable_desc.Name); - output_len += strlen(variable_desc.Name); - file[output_len] = 0; - output_len += 1; - - *(uint32_t *)(file + output_len) = variable_desc.StartOffset; - output_len += 4; - - *(uint32_t *)(file + output_len) = variable_desc.Size; - output_len += 4; - - D3D11_SHADER_TYPE_DESC type_desc; - ID3D11ShaderReflectionType *type = variable->lpVtbl->GetType(variable); - hr = type->lpVtbl->GetDesc(type, &type_desc); - if (hr == S_OK) { - file[output_len] = type_desc.Columns; - output_len += 1; - file[output_len] = type_desc.Rows; - output_len += 1; - } - else { - file[output_len] = 0; - output_len += 1; - file[output_len] = 0; - output_len += 1; - } - } - } - } - else { - file[output_len] = 0; - output_len += 1; - } - - memcpy(file + output_len, (char *)shader_buffer->lpVtbl->GetBufferPointer(shader_buffer), shader_buffer->lpVtbl->GetBufferSize(shader_buffer)); - output_len += shader_buffer->lpVtbl->GetBufferSize(shader_buffer); - - shader_buffer->lpVtbl->Release(shader_buffer); - reflector->lpVtbl->Release(reflector); - shader = (iron_gpu_shader_t *)malloc(sizeof(iron_gpu_shader_t)); - iron_gpu_shader_init(shader, file, (int)output_len, shader_type); - free(file); + iron_gpu_shader_init(shader, (char *)shader_buffer->lpVtbl->GetBufferPointer(shader_buffer), size, shader_type); + shader_buffer->lpVtbl->Release(shader_buffer); #elif defined(IRON_METAL) diff --git a/base/tools/amake/ashader.c b/base/tools/amake/ashader.c index 6b36df1f..64f852bd 100644 --- a/base/tools/amake/ashader.c +++ b/base/tools/amake/ashader.c @@ -1,5 +1,5 @@ -// Simple text processing tool for converting shaders at runtime. +// kong wrapper #include #include @@ -28,17 +28,6 @@ #include #include -static void write_attrib(char *file, int *output_len, const char *attrib, int index) { - if (index > -1) { - strcpy(file + (*output_len), attrib); - (*output_len) += strlen(attrib); - file[(*output_len)] = 0; - (*output_len) += 1; - file[(*output_len)] = index; - (*output_len) += 1; - } -} - char *hlsl_to_bin(char *source, char *shader_type, char *to) { char *type; if (string_equals(shader_type, "vert")) { @@ -58,108 +47,11 @@ char *hlsl_to_bin(char *source, char *shader_type, char *to) { return NULL; } - ID3D11ShaderReflection *reflector = NULL; - D3DReflect(shader_buffer->lpVtbl->GetBufferPointer(shader_buffer), shader_buffer->lpVtbl->GetBufferSize(shader_buffer), &IID_ID3D11ShaderReflection, (void **)&reflector); - - int len = shader_buffer->lpVtbl->GetBufferSize(shader_buffer); - char *file = malloc(len * 2); - int output_len = 0; - - bool has_col = strstr(source, " col:") != NULL || strstr(source, " col :") != NULL; - bool has_nor = strstr(source, " nor:") != NULL || strstr(source, " nor :") != NULL; - bool has_pos = strstr(source, " pos:") != NULL || strstr(source, " pos :") != NULL; - bool has_tex = strstr(source, " tex:") != NULL || strstr(source, " tex :") != NULL; - - int icol = -1; - int inor = -1; - int ipos = -1; - int itex = -1; - - int index = 0; - if (has_col) icol = index++; - if (has_nor) inor = index++; - if (has_pos) ipos = index++; - if (has_tex) itex = index++; - - file[output_len] = (char)index; - output_len += 1; - - write_attrib(file, &output_len, "col", icol); - write_attrib(file, &output_len, "nor", inor); - write_attrib(file, &output_len, "pos", ipos); - write_attrib(file, &output_len, "tex", itex); - - D3D11_SHADER_DESC desc; - reflector->lpVtbl->GetDesc(reflector, &desc); - - file[output_len] = desc.BoundResources; - output_len += 1; - for (int i = 0; i < desc.BoundResources; ++i) { - D3D11_SHADER_INPUT_BIND_DESC bindDesc; - reflector->lpVtbl->GetResourceBindingDesc(reflector, i, &bindDesc); - strcpy(file + output_len, bindDesc.Name); - output_len += strlen(bindDesc.Name); - file[output_len] = 0; - output_len += 1; - file[output_len] = bindDesc.BindPoint; - output_len += 1; - } - - ID3D11ShaderReflectionConstantBuffer *constants = reflector->lpVtbl->GetConstantBufferByName(reflector, "$Globals"); - D3D11_SHADER_BUFFER_DESC buffer_desc; - hr = constants->lpVtbl->GetDesc(constants, &buffer_desc); - if (hr == S_OK) { - file[output_len] = buffer_desc.Variables; - output_len += 1; - for (int i = 0; i < buffer_desc.Variables; ++i) { - ID3D11ShaderReflectionVariable *variable = constants->lpVtbl->GetVariableByIndex(constants, i); - D3D11_SHADER_VARIABLE_DESC variable_desc; - hr = variable->lpVtbl->GetDesc(variable, &variable_desc); - if (hr == S_OK) { - strcpy(file + output_len, variable_desc.Name); - output_len += strlen(variable_desc.Name); - file[output_len] = 0; - output_len += 1; - - *(uint32_t *)(file + output_len) = variable_desc.StartOffset; - output_len += 4; - - *(uint32_t *)(file + output_len) = variable_desc.Size; - output_len += 4; - - D3D11_SHADER_TYPE_DESC type_desc; - ID3D11ShaderReflectionType *type = variable->lpVtbl->GetType(variable); - hr = type->lpVtbl->GetDesc(type, &type_desc); - if (hr == S_OK) { - file[output_len] = type_desc.Columns; - output_len += 1; - file[output_len] = type_desc.Rows; - output_len += 1; - } - else { - file[output_len] = 0; - output_len += 1; - file[output_len] = 0; - output_len += 1; - } - } - } - } - else { - file[output_len] = 0; - output_len += 1; - } - - memcpy(file + output_len, (char *)shader_buffer->lpVtbl->GetBufferPointer(shader_buffer), shader_buffer->lpVtbl->GetBufferSize(shader_buffer)); - output_len += shader_buffer->lpVtbl->GetBufferSize(shader_buffer); - - shader_buffer->lpVtbl->Release(shader_buffer); - reflector->lpVtbl->Release(reflector); - FILE *fp = fopen(to, "wb"); - fwrite(file, 1, output_len, fp); + int len = shader_buffer->lpVtbl->GetBufferSize(shader_buffer); + fwrite((char *)shader_buffer->lpVtbl->GetBufferPointer(shader_buffer), 1, len, fp); fclose(fp); - free(file); + shader_buffer->lpVtbl->Release(shader_buffer); } void hlslbin(const char *from, const char *to) { @@ -222,6 +114,9 @@ void kong_compile(const char *from, const char *to) { } analyze(); + // vulkan + // transform(TRANSFORM_FLAG_ONE_COMPONENT_SWIZZLE); + char output[512]; strcpy(output, to);