Browse Source

Change the batch if the color scale changes

The color scale is a shader constant so it can be applied in linear space
Sam Lantinga 4 months ago
parent
commit
4e5ba722fd

+ 6 - 2
src/render/direct3d11/SDL_render_d3d11.c

@@ -2646,6 +2646,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                 // let's group non joined lines
                 // let's group non joined lines
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *nextcmd;
                 SDL_RenderCommand *nextcmd;
+                float thiscolorscale = cmd->data.draw.color_scale;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
 
 
                 for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
                 for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
@@ -2658,7 +2659,8 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                         break; // can't go any further on this draw call, different render command up next.
                         break; // can't go any further on this draw call, different render command up next.
                     } else if (nextcmd->data.draw.count != 2) {
                     } else if (nextcmd->data.draw.count != 2) {
                         break; // can't go any further on this draw call, those are joined lines
                         break; // can't go any further on this draw call, those are joined lines
-                    } else if (nextcmd->data.draw.blend != thisblend) {
+                    } else if (nextcmd->data.draw.blend != thisblend ||
+                               nextcmd->data.draw.color_scale != thiscolorscale) {
                         break; // can't go any further on this draw call, different blendmode copy up next.
                         break; // can't go any further on this draw call, different blendmode copy up next.
                     } else {
                     } else {
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
@@ -2693,6 +2695,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
         {
         {
             /* as long as we have the same copy command in a row, with the
             /* as long as we have the same copy command in a row, with the
                same texture, we can combine them all into a single draw call. */
                same texture, we can combine them all into a single draw call. */
+            float thiscolorscale = cmd->data.draw.color_scale;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
@@ -2716,7 +2719,8 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                            nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                            nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
-                           nextcmd->data.draw.blend != thisblend) {
+                           nextcmd->data.draw.blend != thisblend ||
+                           nextcmd->data.draw.color_scale != thiscolorscale) {
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                 } else {
                 } else {
                     finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                     finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.

+ 6 - 2
src/render/direct3d12/SDL_render_d3d12.c

@@ -3109,6 +3109,7 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                 // let's group non joined lines
                 // let's group non joined lines
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *nextcmd;
                 SDL_RenderCommand *nextcmd;
+                float thiscolorscale = cmd->data.draw.color_scale;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
 
 
                 for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
                 for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
@@ -3121,7 +3122,8 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                         break; // can't go any further on this draw call, different render command up next.
                         break; // can't go any further on this draw call, different render command up next.
                     } else if (nextcmd->data.draw.count != 2) {
                     } else if (nextcmd->data.draw.count != 2) {
                         break; // can't go any further on this draw call, those are joined lines
                         break; // can't go any further on this draw call, those are joined lines
-                    } else if (nextcmd->data.draw.blend != thisblend) {
+                    } else if (nextcmd->data.draw.blend != thisblend ||
+                               nextcmd->data.draw.color_scale != thiscolorscale) {
                         break; // can't go any further on this draw call, different blendmode copy up next.
                         break; // can't go any further on this draw call, different blendmode copy up next.
                     } else {
                     } else {
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
@@ -3161,6 +3163,7 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
         {
         {
             /* as long as we have the same copy command in a row, with the
             /* as long as we have the same copy command in a row, with the
                same texture, we can combine them all into a single draw call. */
                same texture, we can combine them all into a single draw call. */
+            float thiscolorscale = cmd->data.draw.color_scale;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
@@ -3184,7 +3187,8 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                            nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                            nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
-                           nextcmd->data.draw.blend != thisblend) {
+                           nextcmd->data.draw.blend != thisblend ||
+                           nextcmd->data.draw.color_scale != thiscolorscale) {
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                 } else {
                 } else {
                     finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                     finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.

+ 4 - 0
src/render/gpu/SDL_render_gpu.c

@@ -1247,6 +1247,7 @@ static bool GPU_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
                 // let's group non joined lines
                 // let's group non joined lines
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *nextcmd;
                 SDL_RenderCommand *nextcmd;
+                float thiscolorscale = cmd->data.draw.color_scale;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
                 SDL_GPURenderState *thisrenderstate = cmd->data.draw.gpu_render_state;
                 SDL_GPURenderState *thisrenderstate = cmd->data.draw.gpu_render_state;
 
 
@@ -1261,6 +1262,7 @@ static bool GPU_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
                     } else if (nextcmd->data.draw.count != 2) {
                     } else if (nextcmd->data.draw.count != 2) {
                         break; // can't go any further on this draw call, those are joined lines
                         break; // can't go any further on this draw call, those are joined lines
                     } else if (nextcmd->data.draw.blend != thisblend ||
                     } else if (nextcmd->data.draw.blend != thisblend ||
+                               nextcmd->data.draw.color_scale != thiscolorscale ||
                                nextcmd->data.draw.gpu_render_state != thisrenderstate) {
                                nextcmd->data.draw.gpu_render_state != thisrenderstate) {
                         break; // can't go any further on this draw call, different blendmode copy up next.
                         break; // can't go any further on this draw call, different blendmode copy up next.
                     } else {
                     } else {
@@ -1280,6 +1282,7 @@ static bool GPU_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
         {
         {
             /* as long as we have the same copy command in a row, with the
             /* as long as we have the same copy command in a row, with the
                same texture, we can combine them all into a single draw call. */
                same texture, we can combine them all into a single draw call. */
+            float thiscolorscale = cmd->data.draw.color_scale;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
@@ -1305,6 +1308,7 @@ static bool GPU_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
                            nextcmd->data.draw.blend != thisblend ||
                            nextcmd->data.draw.blend != thisblend ||
+                           nextcmd->data.draw.color_scale != thiscolorscale ||
                            nextcmd->data.draw.gpu_render_state != thisrenderstate) {
                            nextcmd->data.draw.gpu_render_state != thisrenderstate) {
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                 } else {
                 } else {

+ 6 - 2
src/render/metal/SDL_render_metal.m

@@ -1795,6 +1795,7 @@ static bool METAL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                         // let's group non joined lines
                         // let's group non joined lines
                         SDL_RenderCommand *finalcmd = cmd;
                         SDL_RenderCommand *finalcmd = cmd;
                         SDL_RenderCommand *nextcmd;
                         SDL_RenderCommand *nextcmd;
+                        float thiscolorscale = cmd->data.draw.color_scale;
                         SDL_BlendMode thisblend = cmd->data.draw.blend;
                         SDL_BlendMode thisblend = cmd->data.draw.blend;
 
 
                         for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
                         for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
@@ -1807,7 +1808,8 @@ static bool METAL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                                 break; // can't go any further on this draw call, different render command up next.
                                 break; // can't go any further on this draw call, different render command up next.
                             } else if (nextcmd->data.draw.count != 2) {
                             } else if (nextcmd->data.draw.count != 2) {
                                 break; // can't go any further on this draw call, those are joined lines
                                 break; // can't go any further on this draw call, those are joined lines
-                            } else if (nextcmd->data.draw.blend != thisblend) {
+                            } else if (nextcmd->data.draw.blend != thisblend ||
+                                       nextcmd->data.draw.color_scale != thiscolorscale) {
                                 break; // can't go any further on this draw call, different blendmode copy up next.
                                 break; // can't go any further on this draw call, different blendmode copy up next.
                             } else {
                             } else {
                                 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                                 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
@@ -1834,6 +1836,7 @@ static bool METAL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
             case SDL_RENDERCMD_DRAW_POINTS:
             case SDL_RENDERCMD_DRAW_POINTS:
             case SDL_RENDERCMD_GEOMETRY:
             case SDL_RENDERCMD_GEOMETRY:
             {
             {
+                float thiscolorscale = cmd->data.draw.color_scale;
                 SDL_Texture *thistexture = cmd->data.draw.texture;
                 SDL_Texture *thistexture = cmd->data.draw.texture;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
                 SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
                 SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
@@ -1855,7 +1858,8 @@ static bool METAL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
                                nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                                nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                                nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                                nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                                nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
                                nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
-                               nextcmd->data.draw.blend != thisblend) {
+                               nextcmd->data.draw.blend != thisblend ||
+                               nextcmd->data.draw.color_scale != thiscolorscale) {
                         break; // can't go any further on this draw call, different texture/blendmode copy up next.
                         break; // can't go any further on this draw call, different texture/blendmode copy up next.
                     } else {
                     } else {
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.

+ 6 - 2
src/render/vulkan/SDL_render_vulkan.c

@@ -4096,6 +4096,7 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
                 // let's group non joined lines
                 // let's group non joined lines
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *finalcmd = cmd;
                 SDL_RenderCommand *nextcmd;
                 SDL_RenderCommand *nextcmd;
+                float thiscolorscale = cmd->data.draw.color_scale;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
                 SDL_BlendMode thisblend = cmd->data.draw.blend;
 
 
                 for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
                 for (nextcmd = cmd->next; nextcmd; nextcmd = nextcmd->next) {
@@ -4108,7 +4109,8 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
                         break; // can't go any further on this draw call, different render command up next.
                         break; // can't go any further on this draw call, different render command up next.
                     } else if (nextcmd->data.draw.count != 2) {
                     } else if (nextcmd->data.draw.count != 2) {
                         break; // can't go any further on this draw call, those are joined lines
                         break; // can't go any further on this draw call, those are joined lines
-                    } else if (nextcmd->data.draw.blend != thisblend) {
+                    } else if (nextcmd->data.draw.blend != thisblend ||
+                               nextcmd->data.draw.color_scale != thiscolorscale) {
                         break; // can't go any further on this draw call, different blendmode copy up next.
                         break; // can't go any further on this draw call, different blendmode copy up next.
                     } else {
                     } else {
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                         finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
@@ -4149,6 +4151,7 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
         {
         {
             /* as long as we have the same copy command in a row, with the
             /* as long as we have the same copy command in a row, with the
                same texture, we can combine them all into a single draw call. */
                same texture, we can combine them all into a single draw call. */
+            float thiscolorscale = cmd->data.draw.color_scale;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_Texture *thistexture = cmd->data.draw.texture;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_BlendMode thisblend = cmd->data.draw.blend;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
             SDL_ScaleMode thisscalemode = cmd->data.draw.texture_scale_mode;
@@ -4172,7 +4175,8 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
                            nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                            nextcmd->data.draw.texture_scale_mode != thisscalemode ||
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_u != thisaddressmode_u ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
                            nextcmd->data.draw.texture_address_mode_v != thisaddressmode_v ||
-                           nextcmd->data.draw.blend != thisblend) {
+                           nextcmd->data.draw.blend != thisblend ||
+                           nextcmd->data.draw.color_scale != thiscolorscale) {
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                     break; // can't go any further on this draw call, different texture/blendmode copy up next.
                 } else {
                 } else {
                     finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
                     finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.