# HG changeset patch # User Michael Pavone # Date 1542683416 28800 # Node ID c6b2c0f8cc61c0501ae68b2d3ce2916b11189a44 # Parent bc9bb4e5856f4c7f5ef88c4d392e4ccf214e5b4b Implemented support for toggling off a debug view diff -r bc9bb4e5856f -r c6b2c0f8cc61 render.h --- a/render.h Mon Nov 19 09:52:07 2018 -0800 +++ b/render.h Mon Nov 19 19:10:16 2018 -0800 @@ -90,6 +90,7 @@ uint32_t render_map_color(uint8_t r, uint8_t g, uint8_t b); void render_save_screenshot(char *path); uint8_t render_create_window(char *caption, uint32_t width, uint32_t height); +void render_destroy_window(uint8_t which); uint32_t *render_get_framebuffer(uint8_t which, int *pitch); void render_framebuffer_updated(uint8_t which, int width); //returns the framebuffer index associated with the Window that has focus diff -r bc9bb4e5856f -r c6b2c0f8cc61 render_sdl.c --- a/render_sdl.c Mon Nov 19 09:52:07 2018 -0800 +++ b/render_sdl.c Mon Nov 19 19:10:16 2018 -0800 @@ -1328,11 +1328,22 @@ uint8_t render_create_window(char *caption, uint32_t width, uint32_t height) { - num_textures++; - sdl_textures = realloc(sdl_textures, num_textures * sizeof(*sdl_textures)); - extra_windows = realloc(extra_windows, (num_textures - FRAMEBUFFER_USER_START) * sizeof(*extra_windows)); - extra_renderers = realloc(extra_renderers, (num_textures - FRAMEBUFFER_USER_START) * sizeof(*extra_renderers)); - uint8_t win_idx = num_textures - FRAMEBUFFER_USER_START - 1; + uint8_t win_idx = 0xFF; + for (int i = 0; i < num_textures - FRAMEBUFFER_USER_START; i++) + { + if (!extra_windows[i]) { + win_idx = i; + break; + } + } + + if (win_idx == 0xFF) { + num_textures++; + sdl_textures = realloc(sdl_textures, num_textures * sizeof(*sdl_textures)); + extra_windows = realloc(extra_windows, (num_textures - FRAMEBUFFER_USER_START) * sizeof(*extra_windows)); + extra_renderers = realloc(extra_renderers, (num_textures - FRAMEBUFFER_USER_START) * sizeof(*extra_renderers)); + win_idx = num_textures - FRAMEBUFFER_USER_START - 1; + } extra_windows[win_idx] = SDL_CreateWindow(caption, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, 0); if (!extra_windows[win_idx]) { goto fail_window; @@ -1341,7 +1352,7 @@ if (!extra_renderers[win_idx]) { goto fail_renderer; } - uint8_t texture_idx = num_textures-1; + uint8_t texture_idx = win_idx + FRAMEBUFFER_USER_START; sdl_textures[texture_idx] = SDL_CreateTexture(extra_renderers[win_idx], SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height); if (!sdl_textures[texture_idx]) { goto fail_texture; @@ -1357,6 +1368,17 @@ return 0; } +void render_destroy_window(uint8_t which) +{ + uint8_t win_idx = which - FRAMEBUFFER_USER_START; + //Destroying the renderers also frees the textures + SDL_DestroyRenderer(extra_renderers[win_idx]); + SDL_DestroyWindow(extra_windows[win_idx]); + + extra_renderers[win_idx] = NULL; + extra_windows[win_idx] = NULL; +} + uint32_t *locked_pixels; uint32_t locked_pitch; uint32_t *render_get_framebuffer(uint8_t which, int *pitch) diff -r bc9bb4e5856f -r c6b2c0f8cc61 vdp.c --- a/vdp.c Mon Nov 19 09:52:07 2018 -0800 +++ b/vdp.c Mon Nov 19 19:10:16 2018 -0800 @@ -3943,7 +3943,8 @@ void vdp_toggle_debug_view(vdp_context *context, uint8_t debug_type) { if (context->enabled_debuggers & 1 << debug_type) { - //TODO: implement me + render_destroy_window(context->debug_fb_indices[debug_type]); + context->enabled_debuggers &= ~(1 << debug_type); } else { uint32_t width,height; uint8_t fetch_immediately = 0;