From 517a3f801fe9a84bafe462ed9b49720b532ad0be Mon Sep 17 00:00:00 2001 From: aliaspider Date: Sun, 7 Jan 2018 03:26:14 +0100 Subject: [PATCH 1/3] (WIIU) add a tool to convert slang shaders. --- wiiu/slang/Makefile | 8 +++ wiiu/slang/convert.sh | 42 +++++++++++++ wiiu/slang/main.c | 140 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 wiiu/slang/Makefile create mode 100644 wiiu/slang/convert.sh create mode 100644 wiiu/slang/main.c diff --git a/wiiu/slang/Makefile b/wiiu/slang/Makefile new file mode 100644 index 0000000000..ed23d9cb37 --- /dev/null +++ b/wiiu/slang/Makefile @@ -0,0 +1,8 @@ + +all: slang-convert + +slang-convert: main.c + $(CC) $< -o $@ -g -O0 -Wall -Werror + +clean: + rm slang-convert main.o diff --git a/wiiu/slang/convert.sh b/wiiu/slang/convert.sh new file mode 100644 index 0000000000..5837bff140 --- /dev/null +++ b/wiiu/slang/convert.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +#### options #### + +slang_dir=slang-shaders +gshcompiler=$(pwd)/compiler.exe +vshflag=--vsh +pshflag=--psh +outputflag=--out +alignflag=--align + +################# + + +currentdir=$(pwd) + +die () +{ + echo error while converting $name + #mv -f tmp.vsh $currentdir + #mv -f tmp.psh $currentdir + #cp $1 $currentdir 2> /dev/null + #exit 1 +} + + +make + +cd $slang_dir +slang_dir=$(pwd) +slang_files=`find $slang_dir -name "*.slang"` + +for name in $slang_files ; do +echo $name +echo cd $(dirname $name) +cd $(dirname $name) +echo $currentdir/slang-convert --slang $name --vsh tmp.vsh --psh tmp.psh +$currentdir/slang-convert --slang $(basename $name) --vsh tmp.vsh --psh tmp.psh +echo $gshcompiler $alignflag $vshflag tmp.vsh $pshflag tmp.psh $outputflag `echo "$name" | sed "s/\.slang//"`.gsh +$gshcompiler $alignflag $vshflag tmp.vsh $pshflag tmp.psh $outputflag `echo "$name" | sed "s/\.slang//"`.gsh || die $name +rm -rf tmp.vsh tmp.psh +done diff --git a/wiiu/slang/main.c b/wiiu/slang/main.c new file mode 100644 index 0000000000..d20e5f47ef --- /dev/null +++ b/wiiu/slang/main.c @@ -0,0 +1,140 @@ + +#include +#include +#include +#include +#include +#include + +int main(int argc, const char** argv) +{ + + const char* slang = NULL; + const char* vs_asm = NULL; + const char* ps_asm = NULL; + const char* vs_out = NULL; + const char* ps_out = NULL; + + for(int i = 1; i < argc - 1; i+=2) + { + if(!strcmp(argv[i], "--slang")) + slang = argv[i + 1]; + else if(!strcmp(argv[i], "--vsource")) + vs_asm = argv[i + 1]; + else if(!strcmp(argv[i], "--psource")) + ps_asm = argv[i + 1]; + else if(!strcmp(argv[i], "--vsh")) + vs_out = argv[i + 1]; + else if(!strcmp(argv[i], "--psh")) + ps_out = argv[i + 1]; + } + + + if(!slang || !vs_out || !ps_out || (!vs_asm && ps_asm) || (vs_asm && !ps_asm)) + { + printf("Usage :\n"); + printf("%s --slang --vsh --psh \n", argv[0]); + printf("%s --slang --vsource --psource --vsh --psh \n", argv[0]); + } + + char* slang_buffer; + size_t slang_filesize; + { + FILE* slang_file = fopen(slang, "rb"); + fseek(slang_file, 0, SEEK_END); + slang_filesize = ftell(slang_file); + fseek(slang_file, 0, SEEK_SET); + slang_buffer = malloc(slang_filesize + 1); + fread(slang_buffer, 1, slang_filesize, slang_file); + fclose(slang_file); + } + + slang_buffer[slang_filesize] = '\0'; + + FILE* vs_out_fp = fopen(vs_out, "wb"); + FILE* ps_out_fp = fopen(ps_out, "wb"); + + const char* line = "#version 150\n"; + fwrite(line, 1, strlen(line),vs_out_fp); + fwrite(line, 1, strlen(line),ps_out_fp); + + char* next = slang_buffer; + + bool vson = true; + bool pson = true; + + while(*next) + { + const char* line = next; + + while(*next && *next != '\n' && *next != '\r') + next++; + + if (*next == '\r') + *next++ = '\0'; + + *next++ = '\0'; + +// while((*next == '\n') || (*next == '\r')) +// *next++ = '\0'; + + if(strstr(line, "#version")) + continue; + + if(strstr(line, "#pragma")) + { + if(strstr(line, "#pragma stage vertex")) + { + vson = true; + pson = false; + } + else if(strstr(line, "#pragma stage fragment")) + { + vson = false; + pson = true; + } + + continue; + } + + + char* layout = strstr(line, "layout("); + if(layout) + { + while(*layout != ')') + layout++; + + layout++; + + while(*layout && isspace(*layout)) + layout++; + + if(!strncmp(layout, "uniform", 7)) + line = layout; + } + + + + + + if(vson) + { + fwrite(line, 1, strlen(line),vs_out_fp); + fputc('\n', vs_out_fp); + } + + if(pson) + { + fwrite(line, 1, strlen(line),ps_out_fp); + fputc('\n', ps_out_fp); + } + + } + + fclose(vs_out_fp); + fclose(ps_out_fp); + + return 0; +} + + From 7cc34302f4182c20bf21e8cdd15ef9dff6195689 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Sun, 7 Jan 2018 03:40:03 +0100 Subject: [PATCH 2/3] (WIIU) check for NULL in gfd_free --- wiiu/shader_utils.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/wiiu/shader_utils.c b/wiiu/shader_utils.c index e9c59cb413..f4c7b98058 100644 --- a/wiiu/shader_utils.c +++ b/wiiu/shader_utils.c @@ -320,8 +320,11 @@ typedef struct void gfd_free(GFDFile* gfd) { - MEM2_free(gfd->data); - free(gfd); + if(gfd) + { + MEM2_free(gfd->data); + free(gfd); + } } static bool gfd_relocate_block(GFDBlock* block) From 6b24663dd9a3b1289fb0caaa3eab45cb6e0a80c5 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Sun, 7 Jan 2018 03:45:41 +0100 Subject: [PATCH 3/3] (WIIU) add more NULL check to *_free functions. --- wiiu/system/memory.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wiiu/system/memory.c b/wiiu/system/memory.c index d3947b4f65..d0269411d1 100644 --- a/wiiu/system/memory.c +++ b/wiiu/system/memory.c @@ -134,7 +134,8 @@ void * MEM1_alloc(unsigned int size, unsigned int align) void MEM1_free(void *ptr) { - MEMFreeToExpHeap(mem1_heap, ptr); + if (ptr) + MEMFreeToExpHeap(mem1_heap, ptr); } void * MEMBucket_alloc(unsigned int size, unsigned int align) @@ -146,5 +147,6 @@ void * MEMBucket_alloc(unsigned int size, unsigned int align) void MEMBucket_free(void *ptr) { - MEMFreeToExpHeap(bucket_heap, ptr); + if (ptr) + MEMFreeToExpHeap(bucket_heap, ptr); }