Browse Source

testgpu_spinning_cube: fixed error handling if texture creation fails

Sam Lantinga 2 weeks ago
parent
commit
ebd3aa5289
1 changed files with 12 additions and 3 deletions
  1. 12 3
      test/testgpu_spinning_cube.c

+ 12 - 3
test/testgpu_spinning_cube.c

@@ -240,7 +240,7 @@ static bool InitSpriteOverlay(SpriteRenderState *rs, SDL_Window *window)
     return true;
     return true;
 }
 }
 
 
-static void UpdateRenderTarget(SpriteRenderState *rs, SpriteWindowState *ws, int w, int h)
+static bool UpdateRenderTarget(SpriteRenderState *rs, SpriteWindowState *ws, int w, int h)
 {
 {
     SDL_Renderer *renderer = rs->renderer;
     SDL_Renderer *renderer = rs->renderer;
     SDL_Texture *target = ws->target;
     SDL_Texture *target = ws->target;
@@ -249,18 +249,20 @@ static void UpdateRenderTarget(SpriteRenderState *rs, SpriteWindowState *ws, int
         if (target) {
         if (target) {
             SDL_DestroyTexture(target);
             SDL_DestroyTexture(target);
             ws->target = NULL;
             ws->target = NULL;
+            ws->texture = NULL;
         }
         }
 
 
         target = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_TARGET, w, h);
         target = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_TARGET, w, h);
         if (!target) {
         if (!target) {
             SDL_Log("Couldn't create render target: %s", SDL_GetError());
             SDL_Log("Couldn't create render target: %s", SDL_GetError());
-            return;
+            return false;
         }
         }
         SDL_SetRenderTarget(renderer, target);
         SDL_SetRenderTarget(renderer, target);
 
 
         ws->target = target;
         ws->target = target;
         ws->texture = (SDL_GPUTexture *)SDL_GetPointerProperty(SDL_GetTextureProperties(target), SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER, NULL);
         ws->texture = (SDL_GPUTexture *)SDL_GetPointerProperty(SDL_GetTextureProperties(target), SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER, NULL);
     }
     }
+    return true;
 }
 }
 
 
 static void UpdateSprites(SpriteRenderState *rs, SpriteWindowState *ws, int w, int h)
 static void UpdateSprites(SpriteRenderState *rs, SpriteWindowState *ws, int w, int h)
@@ -322,7 +324,9 @@ static void UpdateSpriteOverlay(SpriteRenderState *rs, SpriteWindowState *ws, in
 {
 {
     SDL_Renderer *renderer = rs->renderer;
     SDL_Renderer *renderer = rs->renderer;
 
 
-    UpdateRenderTarget(rs, ws, w, h);
+    if (!UpdateRenderTarget(rs, ws, w, h)) {
+        return;
+    }
 
 
     SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_TRANSPARENT);
     SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_TRANSPARENT);
     SDL_RenderClear(renderer);
     SDL_RenderClear(renderer);
@@ -341,6 +345,11 @@ static void RenderSpriteOverlay(SDL_GPURenderPass *pass, SpriteRenderState *rs,
 {
 {
     SDL_GPUTextureSamplerBinding binding;
     SDL_GPUTextureSamplerBinding binding;
 
 
+    if (!ws->texture) {
+        /* Failed to create a texture, nothing to do */
+        return;
+    }
+
     SDL_zero(binding);
     SDL_zero(binding);
     binding.texture = ws->texture;
     binding.texture = ws->texture;
     binding.sampler = rs->sampler;
     binding.sampler = rs->sampler;