diff --git a/src/render/wiiu/SDL_render_wiiu.c b/src/render/wiiu/SDL_render_wiiu.c index 7bbcd8024..05860523a 100644 --- a/src/render/wiiu/SDL_render_wiiu.c +++ b/src/render/wiiu/SDL_render_wiiu.c @@ -26,6 +26,7 @@ #include "../../video/wiiu/wiiuvideo.h" #include "../SDL_sysrender.h" #include "SDL_hints.h" +#include "SDL_render_wiiu.h" #include #include @@ -35,84 +36,6 @@ /* SDL surface based renderer implementation */ -static SDL_Renderer *WIIU_CreateRenderer(SDL_Window * window, Uint32 flags); -static void WIIU_WindowEvent(SDL_Renderer * renderer, - const SDL_WindowEvent *event); -static int WIIU_GetOutputSize(SDL_Renderer * renderer, int *w, int *h); -static int WIIU_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture); -static int WIIU_SetTextureColorMod(SDL_Renderer * renderer, - SDL_Texture * texture); -static int WIIU_SetTextureAlphaMod(SDL_Renderer * renderer, - SDL_Texture * texture); -static int WIIU_SetTextureBlendMode(SDL_Renderer * renderer, - SDL_Texture * texture); -static int WIIU_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * rect, const void *pixels, - int pitch); -static int WIIU_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * rect, void **pixels, int *pitch); -static void WIIU_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); -static int WIIU_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture); -static int WIIU_UpdateViewport(SDL_Renderer * renderer); -static int WIIU_UpdateClipRect(SDL_Renderer * renderer); -static int WIIU_RenderClear(SDL_Renderer * renderer); -static int WIIU_RenderDrawPoints(SDL_Renderer * renderer, - const SDL_FPoint * points, int count); -static int WIIU_RenderDrawLines(SDL_Renderer * renderer, - const SDL_FPoint * points, int count); -static int WIIU_RenderFillRects(SDL_Renderer * renderer, - const SDL_FRect * rects, int count); -static int WIIU_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * srcrect, const SDL_FRect * dstrect); -static int WIIU_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * srcrect, const SDL_FRect * dstrect, - const double angle, const SDL_FPoint * center, const SDL_RendererFlip flip); -static int WIIU_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, - Uint32 format, void * pixels, int pitch); -static void WIIU_RenderPresent(SDL_Renderer * renderer); -static void WIIU_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); -static void WIIU_DestroyRenderer(SDL_Renderer * renderer); - -SDL_RenderDriver WIIU_RenderDriver = { - .CreateRenderer = WIIU_CreateRenderer, - .info = { - .name = "WiiU GX2", - .flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE, - .num_texture_formats = 5, - .texture_formats = { - SDL_PIXELFORMAT_RGBA8888, - SDL_PIXELFORMAT_RGBA4444, - SDL_PIXELFORMAT_ABGR1555, - SDL_PIXELFORMAT_RGBA5551, - SDL_PIXELFORMAT_RGB565, - }, - .max_texture_width = 0, - .max_texture_height = 0, - }, -}; - -typedef struct -{ - GX2Sampler sampler; - GX2ColorBuffer cbuf; - GX2ContextState ctx; - GX2RBuffer texPositionBuffer; - GX2RBuffer texCoordBuffer; - GX2RBuffer texColourBuffer; -} WIIU_RenderData; - -static Uint32 -TextureNextPow2(Uint32 w) -{ - if(w == 0) - return 0; - Uint32 n = 2; - while(w > n) - n <<= 1; - return n; -} - - SDL_Renderer * WIIU_CreateRenderer(SDL_Window * window, Uint32 flags) { @@ -243,27 +166,6 @@ WIIU_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) } } - -static GX2SurfaceFormat -PixelFormatToWIIUFMT(Uint32 format) -{ - switch (format) { - case SDL_PIXELFORMAT_RGBA8888: - return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; - case SDL_PIXELFORMAT_RGBA4444: - return GX2_SURFACE_FORMAT_UNORM_R4_G4_B4_A4; - case SDL_PIXELFORMAT_ABGR1555: - return GX2_SURFACE_FORMAT_UNORM_A1_B5_G5_R5; - case SDL_PIXELFORMAT_RGBA5551: - return GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1; - case SDL_PIXELFORMAT_RGB565: - return GX2_SURFACE_FORMAT_UNORM_R5_G6_B5; - default: - return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; - } - return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; -} - static int WIIU_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) { @@ -406,6 +308,54 @@ WIIU_RenderPresent(SDL_Renderer * renderer) } } +static Uint32 +TextureNextPow2(Uint32 w) +{ + if(w == 0) + return 0; + Uint32 n = 2; + while(w > n) + n <<= 1; + return n; +} + +static GX2SurfaceFormat +PixelFormatToWIIUFMT(Uint32 format) +{ + switch (format) { + case SDL_PIXELFORMAT_RGBA8888: + return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + case SDL_PIXELFORMAT_RGBA4444: + return GX2_SURFACE_FORMAT_UNORM_R4_G4_B4_A4; + case SDL_PIXELFORMAT_ABGR1555: + return GX2_SURFACE_FORMAT_UNORM_A1_B5_G5_R5; + case SDL_PIXELFORMAT_RGBA5551: + return GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1; + case SDL_PIXELFORMAT_RGB565: + return GX2_SURFACE_FORMAT_UNORM_R5_G6_B5; + default: + return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + } + return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; +} + +SDL_RenderDriver WIIU_RenderDriver = { + .CreateRenderer = WIIU_CreateRenderer, + .info = { + .name = "WiiU GX2", + .flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE, + .num_texture_formats = 5, + .texture_formats = { + SDL_PIXELFORMAT_RGBA8888, + SDL_PIXELFORMAT_RGBA4444, + SDL_PIXELFORMAT_ABGR1555, + SDL_PIXELFORMAT_RGBA5551, + SDL_PIXELFORMAT_RGB565, + }, + .max_texture_width = 0, + .max_texture_height = 0, + }, +}; #endif /* SDL_VIDEO_RENDER_WIIU */ diff --git a/src/render/wiiu/SDL_render_wiiu.h b/src/render/wiiu/SDL_render_wiiu.h new file mode 100644 index 000000000..67e824d8f --- /dev/null +++ b/src/render/wiiu/SDL_render_wiiu.h @@ -0,0 +1,84 @@ +/* + Simple DirectMedia Layer + Copyright (C) 2018-2018 Ash Logan + Copyright (C) 2018-2018 Roberto Van Eeden + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" + +#ifndef SDL_render_wiiu_h +#define SDL_render_wiiu_h + +#include "../SDL_sysrender.h" + +//Utility/helper functions +static GX2SurfaceFormat PixelFormatToWIIUFMT(Uint32 format); +static Uint32 TextureNextPow2(Uint32 w); + +//Driver internal data structures +typedef struct +{ + GX2Sampler sampler; + GX2ColorBuffer cbuf; + GX2ContextState ctx; + GX2RBuffer texPositionBuffer; + GX2RBuffer texCoordBuffer; + GX2RBuffer texColourBuffer; +} WIIU_RenderData; + +//SDL_render API implementation +static SDL_Renderer *WIIU_CreateRenderer(SDL_Window * window, Uint32 flags); +static void WIIU_WindowEvent(SDL_Renderer * renderer, + const SDL_WindowEvent *event); +static int WIIU_GetOutputSize(SDL_Renderer * renderer, int *w, int *h); +static int WIIU_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture); +static int WIIU_SetTextureColorMod(SDL_Renderer * renderer, + SDL_Texture * texture); +static int WIIU_SetTextureAlphaMod(SDL_Renderer * renderer, + SDL_Texture * texture); +static int WIIU_SetTextureBlendMode(SDL_Renderer * renderer, + SDL_Texture * texture); +static int WIIU_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Rect * rect, const void *pixels, + int pitch); +static int WIIU_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Rect * rect, void **pixels, int *pitch); +static void WIIU_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); +static int WIIU_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture); +static int WIIU_UpdateViewport(SDL_Renderer * renderer); +static int WIIU_UpdateClipRect(SDL_Renderer * renderer); +static int WIIU_RenderClear(SDL_Renderer * renderer); +static int WIIU_RenderDrawPoints(SDL_Renderer * renderer, + const SDL_FPoint * points, int count); +static int WIIU_RenderDrawLines(SDL_Renderer * renderer, + const SDL_FPoint * points, int count); +static int WIIU_RenderFillRects(SDL_Renderer * renderer, + const SDL_FRect * rects, int count); +static int WIIU_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Rect * srcrect, const SDL_FRect * dstrect); +static int WIIU_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Rect * srcrect, const SDL_FRect * dstrect, + const double angle, const SDL_FPoint * center, const SDL_RendererFlip flip); +static int WIIU_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, + Uint32 format, void * pixels, int pitch); +static void WIIU_RenderPresent(SDL_Renderer * renderer); +static void WIIU_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); +static void WIIU_DestroyRenderer(SDL_Renderer * renderer); + +#endif //SDL_render_wiiu_h