From d120ddd096029d24889a124ec54726eb4d7fb4bf Mon Sep 17 00:00:00 2001 From: Ash Date: Wed, 17 Oct 2018 18:59:58 +1100 Subject: [PATCH] wiiu/render: move drawing functions to own file --- src/render/wiiu/SDL_rdraw_wiiu.c | 123 ++++++++++++++++++++++++++++++ src/render/wiiu/SDL_render_wiiu.c | 86 --------------------- 2 files changed, 123 insertions(+), 86 deletions(-) create mode 100644 src/render/wiiu/SDL_rdraw_wiiu.c diff --git a/src/render/wiiu/SDL_rdraw_wiiu.c b/src/render/wiiu/SDL_rdraw_wiiu.c new file mode 100644 index 000000000..4a8b74534 --- /dev/null +++ b/src/render/wiiu/SDL_rdraw_wiiu.c @@ -0,0 +1,123 @@ +/* + 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" + +#if SDL_VIDEO_RENDER_WIIU + +#include "../../video/wiiu/wiiuvideo.h" +#include "../SDL_sysrender.h" +#include "SDL_hints.h" +#include "SDL_render_wiiu.h" + +#include +#include +#include +#include +#include + +static int +WIIU_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Rect * srcrect, const SDL_FRect * dstrect) +{ + WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; + GX2Texture *wiiu_tex = (GX2Texture*) texture->driverdata; + + //TODO: Move texCoord/pos math to shader / GX2SetViewport + float transform_x, transform_y; + if (renderer->viewport.x || renderer->viewport.y) { + transform_x = (((renderer->viewport.x + dstrect->x) / (float)data->cbuf.surface.width) * 2.0f)-1.0f; + transform_y = (((renderer->viewport.y + dstrect->y) / (float)data->cbuf.surface.height) * 2.0f)-1.0f; + } else { + transform_x = ((dstrect->x / (float)data->cbuf.surface.width) * 2.0f)-1.0f; + transform_y = ((dstrect->y / (float)data->cbuf.surface.height) * 2.0f)-1.0f; + } + float transform_width = (dstrect->w / (float)data->cbuf.surface.width) * 2.0f; + float transform_height = (dstrect->h / (float)data->cbuf.surface.height) * 2.0f; + + float aPosition[] = + { + transform_x, transform_y, 0.0f, + transform_x + transform_width, transform_y, 0.0f, + transform_x + transform_width, transform_y + transform_height, 0.0f, + transform_x, transform_y + transform_height, 0.0f, + }; + + GX2RLockBufferEx(&data->texPositionBuffer, 0); + memcpy(data->texPositionBuffer.buffer, aPosition, data->texPositionBuffer.elemCount * data->texPositionBuffer.elemSize); + GX2RUnlockBufferEx(&data->texPositionBuffer, 0); + + float tex_x_min = (float)srcrect->x / (float)wiiu_tex->surface.width; + float tex_x_max = (float)(srcrect->x + srcrect->w) / (float)wiiu_tex->surface.width; + float tex_y_min = (float)srcrect->y / (float)wiiu_tex->surface.height; + float tex_y_max = (float)(srcrect->y + srcrect->h) / (float)wiiu_tex->surface.height; + + float aTexCoord[] = + { + tex_x_min, tex_y_max, + tex_x_max, tex_y_max, + tex_x_max, tex_y_min, + tex_x_min, tex_y_min, + }; + + GX2RLockBufferEx(&data->texCoordBuffer, 0); + memcpy(data->texCoordBuffer.buffer, aTexCoord, data->texCoordBuffer.elemCount * data->texCoordBuffer.elemSize); + GX2RUnlockBufferEx(&data->texCoordBuffer, 0); + + //RENDER + GX2SetContextState(&data->ctx); + + GX2SetFetchShader(&texShaders.fetchShader); + GX2SetVertexShader(texShaders.vertexShader); + GX2SetPixelShader(texShaders.pixelShader); + + GX2SetPixelTexture(texture, 0); + GX2SetPixelSampler(sampler, 0); + + GX2RSetAttributeBuffer(&data->texPositionBuffer, 0, data->texPositionBuffer.elemSize, 0); + GX2RSetAttributeBuffer(&data->texCoordBuffer, 1, data->texCoordBuffer.elemSize, 0); + GX2RSetAttributeBuffer(&data->texColourBuffer, 2, data->texColourBuffer.elemSize, 0); + + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4, 0, 1); +} + +static void +WIIU_RenderPresent(SDL_Renderer * renderer) +{ + WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; + SDL_Window *window = renderer->window; + + GX2Invalidate(GX2_INVALIDATE_MODE_CPU | GX2_INVALIDATE_MODE_TEXTURE, data->cbuf.surface.image, data->cbuf.surface.imageSize); + + if (window) { + SDL_UpdateWindowSurface(window); + } +} + +static int +WIIU_RenderClear(SDL_Renderer * renderer) +{ + WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; + GX2ClearColor(&data->cbuf, renderer->r, renderer->g, renderer->b, renderer->a); + return 0; +} + +#endif //SDL_VIDEO_RENDER_WIIU diff --git a/src/render/wiiu/SDL_render_wiiu.c b/src/render/wiiu/SDL_render_wiiu.c index 0619fd485..5b1cc2bfb 100644 --- a/src/render/wiiu/SDL_render_wiiu.c +++ b/src/render/wiiu/SDL_render_wiiu.c @@ -168,92 +168,6 @@ WIIU_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture) return 0; } -static int -WIIU_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, - const SDL_Rect * srcrect, const SDL_FRect * dstrect) -{ - WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; - GX2Texture *wiiu_tex = (GX2Texture*) texture->driverdata; - - //TODO: Move texCoord/pos math to shader / GX2SetViewport - float transform_x, transform_y; - if (renderer->viewport.x || renderer->viewport.y) { - transform_x = (((renderer->viewport.x + dstrect->x) / (float)data->cbuf.surface.width) * 2.0f)-1.0f; - transform_y = (((renderer->viewport.y + dstrect->y) / (float)data->cbuf.surface.height) * 2.0f)-1.0f; - } else { - transform_x = ((dstrect->x / (float)data->cbuf.surface.width) * 2.0f)-1.0f; - transform_y = ((dstrect->y / (float)data->cbuf.surface.height) * 2.0f)-1.0f; - } - float transform_width = (dstrect->w / (float)data->cbuf.surface.width) * 2.0f; - float transform_height = (dstrect->h / (float)data->cbuf.surface.height) * 2.0f; - - float aPosition[] = - { - transform_x, transform_y, 0.0f, - transform_x + transform_width, transform_y, 0.0f, - transform_x + transform_width, transform_y + transform_height, 0.0f, - transform_x, transform_y + transform_height, 0.0f, - }; - - GX2RLockBufferEx(&data->texPositionBuffer, 0); - memcpy(data->texPositionBuffer.buffer, aPosition, data->texPositionBuffer.elemCount * data->texPositionBuffer.elemSize); - GX2RUnlockBufferEx(&data->texPositionBuffer, 0); - - float tex_x_min = (float)srcrect->x / (float)wiiu_tex->surface.width; - float tex_x_max = (float)(srcrect->x + srcrect->w) / (float)wiiu_tex->surface.width; - float tex_y_min = (float)srcrect->y / (float)wiiu_tex->surface.height; - float tex_y_max = (float)(srcrect->y + srcrect->h) / (float)wiiu_tex->surface.height; - - float aTexCoord[] = - { - tex_x_min, tex_y_max, - tex_x_max, tex_y_max, - tex_x_max, tex_y_min, - tex_x_min, tex_y_min, - }; - - GX2RLockBufferEx(&data->texCoordBuffer, 0); - memcpy(data->texCoordBuffer.buffer, aTexCoord, data->texCoordBuffer.elemCount * data->texCoordBuffer.elemSize); - GX2RUnlockBufferEx(&data->texCoordBuffer, 0); - - //RENDER - GX2SetContextState(&data->ctx); - - GX2SetFetchShader(&texShaders.fetchShader); - GX2SetVertexShader(texShaders.vertexShader); - GX2SetPixelShader(texShaders.pixelShader); - - GX2SetPixelTexture(texture, 0); - GX2SetPixelSampler(sampler, 0); - - GX2RSetAttributeBuffer(&data->texPositionBuffer, 0, data->texPositionBuffer.elemSize, 0); - GX2RSetAttributeBuffer(&data->texCoordBuffer, 1, data->texCoordBuffer.elemSize, 0); - GX2RSetAttributeBuffer(&data->texColourBuffer, 2, data->texColourBuffer.elemSize, 0); - - GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4, 0, 1); -} - -static void -WIIU_RenderPresent(SDL_Renderer * renderer) -{ - WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; - SDL_Window *window = renderer->window; - - GX2Invalidate(GX2_INVALIDATE_MODE_CPU | GX2_INVALIDATE_MODE_TEXTURE, data->cbuf.surface.image, data->cbuf.surface.imageSize); - - if (window) { - SDL_UpdateWindowSurface(window); - } -} - -static int -WIIU_RenderClear(SDL_Renderer * renderer) -{ - WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; - GX2ClearColor(&data->cbuf, renderer->r, renderer->g, renderer->b, renderer->a); - return 0; -} - SDL_RenderDriver WIIU_RenderDriver = { .CreateRenderer = WIIU_CreateRenderer, .info = {