Allow surfaces to be marked as not-render-targets
The Wii U has a very limited pool of memory for render targets (32MB), so we should only use it if we have to. This 'fixes' a bug in the enhanced branch, where if you use 2x sprites at 854x480, the third line of the text box will be corrupted (text will appear on the second line instead, and be black instead of white). The other renderers haven't been updated for the API change yet.
This commit is contained in:
parent
ebb96ad239
commit
a2cdd9ac18
3 changed files with 33 additions and 18 deletions
|
@ -14,7 +14,7 @@ typedef struct RenderBackend_Rect
|
|||
RenderBackend_Surface* RenderBackend_Init(const char *window_title, int screen_width, int screen_height, bool fullscreen);
|
||||
void RenderBackend_Deinit(void);
|
||||
void RenderBackend_DrawScreen(void);
|
||||
RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned int height);
|
||||
RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned int height, bool render_target);
|
||||
void RenderBackend_FreeSurface(RenderBackend_Surface *surface);
|
||||
bool RenderBackend_IsSurfaceLost(RenderBackend_Surface *surface);
|
||||
void RenderBackend_RestoreSurface(RenderBackend_Surface *surface);
|
||||
|
|
|
@ -31,6 +31,7 @@ typedef struct RenderBackend_Surface
|
|||
GX2ColorBuffer colour_buffer;
|
||||
unsigned int width;
|
||||
unsigned int height;
|
||||
bool render_target;
|
||||
unsigned char *lock_buffer; // TODO - Dumb
|
||||
} RenderBackend_Surface;
|
||||
|
||||
|
@ -146,7 +147,7 @@ RenderBackend_Surface* RenderBackend_Init(const char *window_title, int screen_w
|
|||
GX2InitSampler(&sampler, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_LINEAR);
|
||||
|
||||
// Create framebuffer surface
|
||||
framebuffer_surface = RenderBackend_CreateSurface(screen_width, screen_height);
|
||||
framebuffer_surface = RenderBackend_CreateSurface(screen_width, screen_height, true);
|
||||
|
||||
if (framebuffer_surface != NULL)
|
||||
{
|
||||
|
@ -350,7 +351,7 @@ void RenderBackend_DrawScreen(void)
|
|||
GX2SetContextState(gx2_context);
|
||||
}
|
||||
|
||||
RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned int height)
|
||||
RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned int height, bool render_target)
|
||||
{
|
||||
RenderBackend_Surface *surface = (RenderBackend_Surface*)malloc(sizeof(RenderBackend_Surface));
|
||||
|
||||
|
@ -358,6 +359,7 @@ RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned
|
|||
{
|
||||
surface->width = width;
|
||||
surface->height = height;
|
||||
surface->render_target = render_target;
|
||||
|
||||
// Initialise texture
|
||||
memset(&surface->texture, 0, sizeof(surface->texture));
|
||||
|
@ -374,9 +376,19 @@ RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned
|
|||
GX2CalcSurfaceSizeAndAlignment(&surface->texture.surface);
|
||||
GX2InitTextureRegs(&surface->texture);
|
||||
|
||||
if (GX2RCreateSurface(&surface->texture.surface, (GX2RResourceFlags)(GX2R_RESOURCE_BIND_TEXTURE | GX2R_RESOURCE_BIND_COLOR_BUFFER |
|
||||
GX2RResourceFlags resource_flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_TEXTURE |
|
||||
GX2R_RESOURCE_USAGE_CPU_WRITE | GX2R_RESOURCE_USAGE_CPU_READ |
|
||||
GX2R_RESOURCE_USAGE_GPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ)))
|
||||
GX2R_RESOURCE_USAGE_GPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ);
|
||||
|
||||
resource_flags = (GX2RResourceFlags)(resource_flags | GX2R_RESOURCE_BIND_COLOR_BUFFER);
|
||||
|
||||
if (GX2RCreateSurface(&surface->texture.surface, resource_flags))
|
||||
{
|
||||
if (!render_target)
|
||||
{
|
||||
return surface;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Initialise colour buffer (needed so the texture can be drawn to)
|
||||
memset(&surface->colour_buffer, 0, sizeof(surface->colour_buffer));
|
||||
|
@ -392,6 +404,7 @@ RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned
|
|||
|
||||
GX2RDestroySurfaceEx(&surface->texture.surface, (GX2RResourceFlags)0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Backend_PrintError("GX2RCreateSurface failed in RenderBackend_CreateSurface");
|
||||
|
@ -407,7 +420,9 @@ void RenderBackend_FreeSurface(RenderBackend_Surface *surface)
|
|||
{
|
||||
if (surface != NULL)
|
||||
{
|
||||
if (surface->render_target)
|
||||
GX2RDestroySurfaceEx(&surface->colour_buffer.surface, (GX2RResourceFlags)0);
|
||||
|
||||
GX2RDestroySurfaceEx(&surface->texture.surface, (GX2RResourceFlags)0);
|
||||
free(surface);
|
||||
}
|
||||
|
|
|
@ -219,7 +219,7 @@ BOOL MakeSurface_Resource(const char *name, SurfaceID surf_no)
|
|||
if (image_buffer == NULL)
|
||||
return FALSE;
|
||||
|
||||
surf[surf_no] = RenderBackend_CreateSurface(width * magnification, height * magnification);
|
||||
surf[surf_no] = RenderBackend_CreateSurface(width * magnification, height * magnification, false);
|
||||
|
||||
if (surf[surf_no] == NULL)
|
||||
{
|
||||
|
@ -281,7 +281,7 @@ BOOL MakeSurface_File(const char *name, SurfaceID surf_no)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
surf[surf_no] = RenderBackend_CreateSurface(width * magnification, height * magnification);
|
||||
surf[surf_no] = RenderBackend_CreateSurface(width * magnification, height * magnification, false);
|
||||
|
||||
if (surf[surf_no] == NULL)
|
||||
{
|
||||
|
@ -392,7 +392,7 @@ BOOL MakeSurface_Generic(int bxsize, int bysize, SurfaceID surf_no, BOOL bSystem
|
|||
if (surf[surf_no] != NULL)
|
||||
return FALSE;
|
||||
|
||||
surf[surf_no] = RenderBackend_CreateSurface(bxsize * magnification, bysize * magnification);
|
||||
surf[surf_no] = RenderBackend_CreateSurface(bxsize * magnification, bysize * magnification, true);
|
||||
|
||||
if (surf[surf_no] == NULL)
|
||||
return FALSE;
|
||||
|
|
Loading…
Add table
Reference in a new issue