From 81153f627c1d182554e81ffc72bc16fb196c24f5 Mon Sep 17 00:00:00 2001 From: "BADIM-PC\\Vadim" Date: Mon, 26 Feb 2018 12:03:04 +0300 Subject: [PATCH] fixed icon, gamepad, mouse cursor --- src/ext/shader/common.vert | 19 -- src/system.c | 405 +++++++++++++++++++------------------ src/system/chip.c | 2 +- 3 files changed, 211 insertions(+), 215 deletions(-) delete mode 100644 src/ext/shader/common.vert diff --git a/src/ext/shader/common.vert b/src/ext/shader/common.vert deleted file mode 100644 index ff038ec..0000000 --- a/src/ext/shader/common.vert +++ /dev/null @@ -1,19 +0,0 @@ -SHADER(#version 100\n - -precision highp float; -precision mediump int; - -attribute vec2 gpu_Vertex; -attribute vec2 gpu_TexCoord; -attribute mediump vec4 gpu_Color; -uniform mat4 gpu_ModelViewProjectionMatrix; - -varying mediump vec4 color; -varying vec2 texCoord; - -void main(void) -{ - color = gpu_Color; - texCoord = vec2(gpu_TexCoord); - gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0); -}) \ No newline at end of file diff --git a/src/system.c b/src/system.c index 56f25ed..397f8fc 100644 --- a/src/system.c +++ b/src/system.c @@ -13,7 +13,7 @@ #endif #define STUDIO_UI_SCALE 4 -#define STUDIO_PIXEL_FORMAT SDL_PIXELFORMAT_ABGR8888 +#define STUDIO_PIXEL_FORMAT GPU_FORMAT_RGBA #define TEXTURE_SIZE (TIC80_FULLWIDTH) #define OFFSET_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2) #define OFFSET_TOP ((TIC80_FULLHEIGHT-TIC80_HEIGHT)/2) @@ -28,7 +28,8 @@ static struct { GPU_Target* screen; GPU_Image* texture; - u32 crt_shader; + u32 shader; + GPU_ShaderBlock block; bool useShader; } gpu; @@ -123,7 +124,7 @@ static void setWindowIcon() SDL_Surface* surface = SDL_CreateRGBSurfaceFrom(pixels, Size, Size, sizeof(s32) * BITS_IN_BYTE, Size * sizeof(s32), - 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); + 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); SDL_SetWindowIcon(platform.window, surface); SDL_FreeSurface(surface); @@ -158,56 +159,53 @@ static void updateGamepadParts() platform.gamepad.part.y = (SDL_Point){rect.w - 2*tileSize, 0*tileSize + offset}; } -// static void transparentBlit(u32* out, s32 pitch) -// { -// const u8* in = platform.studio->tic->ram.vram.screen.data; -// const u8* end = in + sizeof(platform.studio->tic->ram.vram.screen); -// const u32* pal = tic_palette_blit(&platform.studio->tic->config.palette); -// const u32 Delta = (pitch/sizeof *out - TIC80_WIDTH); - -// s32 col = 0; - -// while(in != end) -// { -// u8 low = *in & 0x0f; -// u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; -// *out++ = low ? (*(pal + low) | 0xff000000) : 0; -// *out++ = hi ? (*(pal + hi) | 0xff000000) : 0; -// in++; - -// col += BITS_IN_BYTE / TIC_PALETTE_BPP; - -// if (col == TIC80_WIDTH) -// { -// col = 0; -// out += Delta; -// } -// } -// } - static void initTouchGamepad() { - if (!platform.gpu.screen) - return; + platform.studio->tic->api.map(platform.studio->tic, &platform.studio->tic->config.bank0.map, &platform.studio->tic->config.bank0.tiles, 0, 0, TIC_MAP_SCREEN_WIDTH, TIC_MAP_SCREEN_HEIGHT, 0, 0, -1, 1); - // platform.studio->tic->api.map(platform.studio->tic, &platform.studio->tic->config.bank0.map, &platform.studio->tic->config.bank0.tiles, 0, 0, TIC_MAP_SCREEN_WIDTH, TIC_MAP_SCREEN_HEIGHT, 0, 0, -1, 1); + if(!platform.gamepad.texture) + { + platform.gamepad.texture = GPU_CreateImage(TEXTURE_SIZE, TEXTURE_SIZE, STUDIO_PIXEL_FORMAT); + GPU_SetAnchor(platform.gamepad.texture, 0, 0); + GPU_SetImageFilter(platform.gamepad.texture, GPU_FILTER_NEAREST); + } - // if(!platform.gamepad.texture) - // { - // platform.gamepad.texture = SDL_CreateTexture(platform.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TEXTURE_SIZE, TEXTURE_SIZE); - // SDL_SetTextureBlendMode(platform.gamepad.texture, SDL_BLENDMODE_BLEND); - // } + u32* data = SDL_malloc(TEXTURE_SIZE * TEXTURE_SIZE * sizeof(u32)); - // { - // void* pixels = NULL; - // s32 pitch = 0; + if(data) + { + u32* out = data; - // SDL_LockTexture(platform.gamepad.texture, NULL, &pixels, &pitch); - // transparentBlit(pixels, pitch); - // SDL_UnlockTexture(platform.gamepad.texture); - // } + const u8* in = platform.studio->tic->ram.vram.screen.data; + const u8* end = in + sizeof(platform.studio->tic->ram.vram.screen); + const u32* pal = tic_palette_blit(&platform.studio->tic->config.palette); + const u32 Delta = ((TIC80_FULLWIDTH*sizeof(u32))/sizeof *out - TIC80_WIDTH); - // updateGamepadParts(); + s32 col = 0; + + while(in != end) + { + u8 low = *in & 0x0f; + u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; + *out++ = low ? *(pal + low) : 0; + *out++ = hi ? *(pal + hi) : 0; + in++; + + col += BITS_IN_BYTE / TIC_PALETTE_BPP; + + if (col == TIC80_WIDTH) + { + col = 0; + out += Delta; + } + } + + GPU_UpdateImageBytes(platform.gamepad.texture, NULL, (const u8*)data, TEXTURE_SIZE * sizeof(u32)); + + SDL_free(data); + + updateGamepadParts(); + } } static void calcTextureRect(SDL_Rect* rect) @@ -321,49 +319,49 @@ static void processKeyboard() static bool checkTouch(const SDL_Rect* rect, s32* x, s32* y) { - // s32 devices = SDL_GetNumTouchDevices(); - // s32 width = 0, height = 0; - // SDL_GetWindowSize(platform.window, &width, &height); + s32 devices = SDL_GetNumTouchDevices(); + s32 width = 0, height = 0; + SDL_GetWindowSize(platform.window, &width, &height); - // for (s32 i = 0; i < devices; i++) - // { - // SDL_TouchID id = SDL_GetTouchDevice(i); + for (s32 i = 0; i < devices; i++) + { + SDL_TouchID id = SDL_GetTouchDevice(i); - // // very strange, but on Android id always == 0 - // //if (id) - // { - // s32 fingers = SDL_GetNumTouchFingers(id); + // very strange, but on Android id always == 0 + //if (id) + { + s32 fingers = SDL_GetNumTouchFingers(id); - // if(fingers) - // { - // platform.gamepad.counter = 0; + if(fingers) + { + platform.gamepad.counter = 0; - // if (!platform.gamepad.show) - // { - // platform.gamepad.alpha = platform.studio->config()->theme.gamepad.touch.alpha; - // SDL_SetTextureAlphaMod(platform.gamepad.texture, platform.gamepad.alpha); - // platform.gamepad.show = true; - // return false; - // } - // } + if (!platform.gamepad.show) + { + platform.gamepad.alpha = platform.studio->config()->theme.gamepad.touch.alpha; + GPU_SetRGBA(platform.gamepad.texture, 0xff, 0xff, 0xff, platform.gamepad.alpha); + platform.gamepad.show = true; + return false; + } + } - // for (s32 f = 0; f < fingers; f++) - // { - // SDL_Finger* finger = SDL_GetTouchFinger(id, f); + for (s32 f = 0; f < fingers; f++) + { + SDL_Finger* finger = SDL_GetTouchFinger(id, f); - // if (finger && finger->pressure > 0.0f) - // { - // SDL_Point point = { (s32)(finger->x * width), (s32)(finger->y * height) }; - // if (SDL_PointInRect(&point, rect)) - // { - // *x = point.x; - // *y = point.y; - // return true; - // } - // } - // } - // } - // } + if (finger && finger->pressure > 0.0f) + { + SDL_Point point = { (s32)(finger->x * width), (s32)(finger->y * height) }; + if (SDL_PointInRect(&point, rect)) + { + *x = point.x; + *y = point.y; + return true; + } + } + } + } + } return false; } @@ -675,104 +673,99 @@ static void blitSound() static void renderGamepad() { - // if(platform.gamepad.show || platform.gamepad.alpha); else return; + if(platform.gamepad.show || platform.gamepad.alpha); else return; - // const s32 tileSize = platform.gamepad.part.size; - // const SDL_Point axis = platform.gamepad.part.axis; - // typedef struct { bool press; s32 x; s32 y;} Tile; - // const Tile Tiles[] = - // { - // {platform.studio->tic->ram.input.gamepads.first.up, axis.x + 1*tileSize, axis.y + 0*tileSize}, - // {platform.studio->tic->ram.input.gamepads.first.down, axis.x + 1*tileSize, axis.y + 2*tileSize}, - // {platform.studio->tic->ram.input.gamepads.first.left, axis.x + 0*tileSize, axis.y + 1*tileSize}, - // {platform.studio->tic->ram.input.gamepads.first.right, axis.x + 2*tileSize, axis.y + 1*tileSize}, + const s32 tileSize = platform.gamepad.part.size; + const SDL_Point axis = platform.gamepad.part.axis; + typedef struct { bool press; s32 x; s32 y;} Tile; + const Tile Tiles[] = + { + {platform.studio->tic->ram.input.gamepads.first.up, axis.x + 1*tileSize, axis.y + 0*tileSize}, + {platform.studio->tic->ram.input.gamepads.first.down, axis.x + 1*tileSize, axis.y + 2*tileSize}, + {platform.studio->tic->ram.input.gamepads.first.left, axis.x + 0*tileSize, axis.y + 1*tileSize}, + {platform.studio->tic->ram.input.gamepads.first.right, axis.x + 2*tileSize, axis.y + 1*tileSize}, - // {platform.studio->tic->ram.input.gamepads.first.a, platform.gamepad.part.a.x, platform.gamepad.part.a.y}, - // {platform.studio->tic->ram.input.gamepads.first.b, platform.gamepad.part.b.x, platform.gamepad.part.b.y}, - // {platform.studio->tic->ram.input.gamepads.first.x, platform.gamepad.part.x.x, platform.gamepad.part.x.y}, - // {platform.studio->tic->ram.input.gamepads.first.y, platform.gamepad.part.y.x, platform.gamepad.part.y.y}, - // }; + {platform.studio->tic->ram.input.gamepads.first.a, platform.gamepad.part.a.x, platform.gamepad.part.a.y}, + {platform.studio->tic->ram.input.gamepads.first.b, platform.gamepad.part.b.x, platform.gamepad.part.b.y}, + {platform.studio->tic->ram.input.gamepads.first.x, platform.gamepad.part.x.x, platform.gamepad.part.x.y}, + {platform.studio->tic->ram.input.gamepads.first.y, platform.gamepad.part.y.x, platform.gamepad.part.y.y}, + }; - // enum {ButtonsCount = 8}; + enum {ButtonsCount = 8}; - // for(s32 i = 0; i < COUNT_OF(Tiles); i++) - // { - // const Tile* tile = Tiles + i; - // SDL_Rect src = {(tile->press ? ButtonsCount + i : i) * TIC_SPRITESIZE, 0, TIC_SPRITESIZE, TIC_SPRITESIZE}; - // SDL_Rect dest = {tile->x, tile->y, tileSize, tileSize}; + for(s32 i = 0; i < COUNT_OF(Tiles); i++) + { + const Tile* tile = Tiles + i; + GPU_Rect src = {(tile->press ? ButtonsCount + i : i) * TIC_SPRITESIZE, 0, TIC_SPRITESIZE, TIC_SPRITESIZE}; + GPU_Rect dest = {tile->x, tile->y, tileSize, tileSize}; - // SDL_RenderCopy(platform.renderer, platform.gamepad.texture, &src, &dest); - // } + GPU_BlitScale(platform.gamepad.texture, &src, platform.gpu.screen, dest.x, dest.y, + (float)dest.w / TIC_SPRITESIZE, (float)dest.h / TIC_SPRITESIZE); + } - // if(!platform.gamepad.show && platform.gamepad.alpha) - // { - // enum {Step = 3}; + if(!platform.gamepad.show && platform.gamepad.alpha) + { + enum {Step = 3}; - // if(platform.gamepad.alpha - Step >= 0) platform.gamepad.alpha -= Step; - // else platform.gamepad.alpha = 0; + if(platform.gamepad.alpha - Step >= 0) platform.gamepad.alpha -= Step; + else platform.gamepad.alpha = 0; - // SDL_SetTextureAlphaMod(platform.gamepad.texture, platform.gamepad.alpha); - // } + GPU_SetRGBA(platform.gamepad.texture, 0xff, 0xff, 0xff, platform.gamepad.alpha); + } - // platform.gamepad.counter = platform.gamepad.touch.data ? 0 : platform.gamepad.counter+1; + platform.gamepad.counter = platform.gamepad.touch.data ? 0 : platform.gamepad.counter+1; - // // wait 5 seconds and hide touch gamepad - // if(platform.gamepad.counter >= 5 * TIC_FRAMERATE) - // platform.gamepad.show = false; + // wait 5 seconds and hide touch gamepad + if(platform.gamepad.counter >= 5 * TIC_FRAMERATE) + platform.gamepad.show = false; } static void blitCursor(const u8* in) { - // if(!platform.mouse.texture) - // { - // platform.mouse.texture = SDL_CreateTexture(platform.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TIC_SPRITESIZE, TIC_SPRITESIZE); - // SDL_SetTextureBlendMode(platform.mouse.texture, SDL_BLENDMODE_BLEND); - // } + if(!platform.mouse.texture) + { + platform.mouse.texture = GPU_CreateImage(TIC_SPRITESIZE, TIC_SPRITESIZE, STUDIO_PIXEL_FORMAT); + GPU_SetAnchor(platform.mouse.texture, 0, 0); + GPU_SetImageFilter(platform.mouse.texture, GPU_FILTER_NEAREST); + } - // if(platform.mouse.src != in) - // { - // platform.mouse.src = in; + if(platform.mouse.src != in) + { + platform.mouse.src = in; - // void* pixels = NULL; - // s32 pitch = 0; - // SDL_LockTexture(platform.mouse.texture, NULL, &pixels, &pitch); + const u8* end = in + sizeof(tic_tile); + const u32* pal = tic_palette_blit(&platform.studio->tic->ram.vram.palette); + static u32 data[TIC_SPRITESIZE*TIC_SPRITESIZE]; + u32* out = data; - // { - // const u8* end = in + sizeof(tic_tile); - // const u32* pal = tic_palette_blit(&platform.studio->tic->ram.vram.palette); - // u32* out = pixels; + while(in != end) + { + u8 low = *in & 0x0f; + u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; + *out++ = low ? *(pal + low) : 0; + *out++ = hi ? *(pal + hi) : 0; - // while(in != end) - // { - // u8 low = *in & 0x0f; - // u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; - // *out++ = low ? (*(pal + low) | 0xff000000) : 0; - // *out++ = hi ? (*(pal + hi) | 0xff000000) : 0; + in++; + } - // in++; - // } - // } + GPU_UpdateImageBytes(platform.mouse.texture, NULL, (const u8*)data, TIC_SPRITESIZE * sizeof(u32)); + } - // SDL_UnlockTexture(platform.mouse.texture); - // } + SDL_Rect rect = {0, 0, 0, 0}; + calcTextureRect(&rect); + s32 scale = rect.w / TIC80_WIDTH; - // SDL_Rect rect = {0, 0, 0, 0}; - // calcTextureRect(&rect); - // s32 scale = rect.w / TIC80_WIDTH; + s32 mx, my; + SDL_GetMouseState(&mx, &my); - // SDL_Rect src = {0, 0, TIC_SPRITESIZE, TIC_SPRITESIZE}; - // SDL_Rect dst = {0, 0, TIC_SPRITESIZE * scale, TIC_SPRITESIZE * scale}; + if(platform.studio->config()->theme.cursor.pixelPerfect) + { + mx -= (mx - rect.x) % scale; + my -= (my - rect.y) % scale; + } - // SDL_GetMouseState(&dst.x, &dst.y); - - // if(platform.studio->config()->theme.cursor.pixelPerfect) - // { - // dst.x -= (dst.x - rect.x) % scale; - // dst.y -= (dst.y - rect.y) % scale; - // } - - // if(SDL_GetWindowFlags(platform.window) & SDL_WINDOW_MOUSE_FOCUS) - // SDL_RenderCopy(platform.renderer, platform.mouse.texture, &src, &dst); + if(SDL_GetWindowFlags(platform.window) & SDL_WINDOW_MOUSE_FOCUS) + GPU_BlitScale(platform.mouse.texture, NULL, platform.gpu.screen, mx, my, (float)scale, (float)scale); } static void renderCursor() @@ -891,7 +884,6 @@ static u64 getPerformanceFrequency() static void goFullscreen() { GPU_SetFullscreen(GPU_GetFullscreen() ? false : true, true); - // SDL_SetWindowFullscreen(platform.window, SDL_GetWindowFlags(platform.window) & SDL_WINDOW_FULLSCREEN_DESKTOP ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP); } static void showMessageBox(const char* title, const char* message) @@ -994,38 +986,42 @@ static void gpuTick() { platform.studio->tick(); - renderCursor(); - renderGamepad(); GPU_UpdateImageBytes(platform.gpu.texture, NULL, (const u8*)tic->screen, TIC80_FULLWIDTH * sizeof(u32)); { - if(platform.gpu.useShader) { SDL_Rect rect = {0, 0, 0, 0}; calcTextureRect(&rect); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_x"), rect.x); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_y"), rect.y); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_w"), rect.w); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_h"), rect.h); + GPU_ActivateShaderProgram(platform.gpu.shader, &platform.gpu.block); + + GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_x"), rect.x); + GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_y"), rect.y); + GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_w"), rect.w); + GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_h"), rect.h); { s32 w, h; SDL_GetWindowSize(platform.window, &w, &h); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "scr_w"), w); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "scr_h"), h); + GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "scr_w"), w); + GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "scr_h"), h); } - GPU_BlitScale(platform.gpu.texture, NULL, platform.gpu.screen, rect.x, rect.y, (float)rect.w / TIC80_FULLWIDTH, (float)rect.h / TIC80_FULLHEIGHT); + GPU_BlitScale(platform.gpu.texture, NULL, platform.gpu.screen, rect.x, rect.y, + (float)rect.w / TIC80_FULLWIDTH, (float)rect.h / TIC80_FULLHEIGHT); + + GPU_ActivateShaderProgram(0, NULL); } else { blitGpuTexture(platform.gpu.screen, platform.gpu.texture); } - } + + renderCursor(); + renderGamepad(); } GPU_Flip(platform.gpu.screen); @@ -1083,40 +1079,53 @@ static void emsGpuTick() #define SHADER(...) #__VA_ARGS__ -u32 load_shader_program() +static void loadCrtShader() { - static const char* VertexShader = - #include "ext/shader/common.vert" - ; + static const char* VertexShader = "#version 100\n\ + precision highp float;\n\ + precision mediump int;\n\ + attribute vec2 gpu_Vertex;\n\ + attribute vec2 gpu_TexCoord;\n\ + attribute mediump vec4 gpu_Color;\n\ + uniform mat4 gpu_ModelViewProjectionMatrix;\n\ + varying mediump vec4 color;\n\ + varying vec2 texCoord;\n\ + void main(void)\n\ + {\n\ + color = gpu_Color;\n\ + texCoord = vec2(gpu_TexCoord);\n\ + gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\ + }"; - u32 v = GPU_CompileShader(GPU_VERTEX_SHADER, VertexShader); + u32 vertex = GPU_CompileShader(GPU_VERTEX_SHADER, VertexShader); - if(!v) + if(!vertex) + { GPU_LogError("Failed to load vertex shader: %s\n", GPU_GetShaderMessage()); + return; + } static const char* PixelShader = #include "ext/shader/crt-lottes.frag" ; - u32 f = GPU_CompileShader(GPU_PIXEL_SHADER, PixelShader); + u32 fragment = GPU_CompileShader(GPU_PIXEL_SHADER, PixelShader); - if(!f) + if(!fragment) + { GPU_LogError("Failed to load fragment shader: %s\n", GPU_GetShaderMessage()); + return; + } - u32 p = GPU_LinkShaders(v, f); + platform.gpu.shader = GPU_LinkShaders(vertex, fragment); - if(!p) + if(platform.gpu.shader) { + platform.gpu.block = GPU_LoadShaderBlock(platform.gpu.shader, "gpu_Vertex", "gpu_TexCoord", "gpu_Color", "gpu_ModelViewProjectionMatrix"); + GPU_ActivateShaderProgram(platform.gpu.shader, &platform.gpu.block); + } + else GPU_LogError("Failed to link shader program: %s\n", GPU_GetShaderMessage()); - return p; - } - - { - GPU_ShaderBlock block = GPU_LoadShaderBlock(p, "gpu_Vertex", "gpu_TexCoord", "gpu_Color", "gpu_ModelViewProjectionMatrix"); - GPU_ActivateShaderProgram(p, &block); - - return p; - } } static s32 start(s32 argc, char **argv, const char* folder) @@ -1129,8 +1138,6 @@ static s32 start(s32 argc, char **argv, const char* folder) platform.studio = studioInit(argc, argv, platform.audio.spec.freq, folder, &systemInterface); - initTouchGamepad(); - enum{Width = TIC80_FULLWIDTH * STUDIO_UI_SCALE, Height = TIC80_FULLHEIGHT * STUDIO_UI_SCALE}; platform.window = SDL_CreateWindow( TIC_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, @@ -1142,14 +1149,16 @@ static s32 start(s32 argc, char **argv, const char* folder) platform.gpu.screen = GPU_Init(Width, Height, GPU_INIT_DISABLE_VSYNC); - platform.gpu.texture = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, GPU_FORMAT_RGBA); + initTouchGamepad(); + + platform.gpu.texture = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, STUDIO_PIXEL_FORMAT); GPU_SetAnchor(platform.gpu.texture, 0, 0); GPU_SetImageFilter(platform.gpu.texture, GPU_FILTER_NEAREST); platform.gpu.useShader = true; if(platform.gpu.useShader) - platform.gpu.crt_shader = load_shader_program(); + loadCrtShader(); #if defined(__EMSCRIPTEN__) @@ -1187,9 +1196,12 @@ static s32 start(s32 argc, char **argv, const char* folder) closeNet(platform.net); - SDL_CloseAudioDevice(platform.audio.device); + if(platform.audio.cvt.buf) + SDL_free(platform.audio.cvt.buf); + + if(platform.gpu.shader) + GPU_FreeShaderProgram(platform.gpu.shader); - GPU_FreeShaderProgram(platform.gpu.crt_shader); GPU_FreeImage(platform.gpu.texture); if(platform.gamepad.texture) @@ -1198,6 +1210,9 @@ static s32 start(s32 argc, char **argv, const char* folder) if(platform.mouse.texture) GPU_FreeImage(platform.mouse.texture); + SDL_DestroyWindow(platform.window); + SDL_CloseAudioDevice(platform.audio.device); + GPU_Quit(); return 0; diff --git a/src/system/chip.c b/src/system/chip.c index 21eb629..49fb9f6 100644 --- a/src/system/chip.c +++ b/src/system/chip.c @@ -7,7 +7,7 @@ #include #include -#define STUDIO_UI_SCALE 3 +#define STUDIO_UI_SCALE 2 #define STUDIO_PIXEL_FORMAT SDL_PIXELFORMAT_ABGR8888 #define TEXTURE_SIZE (TIC80_FULLWIDTH) #define OFFSET_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2)