mirror of
https://github.com/libretro/RetroArch
synced 2025-04-17 02:43:03 +00:00
(RSX) Updates to video driver
This commit is contained in:
parent
1d35e1a460
commit
581b9e0b0d
@ -17,15 +17,18 @@
|
||||
#ifndef RSX_COMMON_H__
|
||||
#define RSX_COMMON_H__
|
||||
|
||||
#include <rsx/rsx.h>
|
||||
#include <rsx/nv40.h>
|
||||
#include <ppu-types.h>
|
||||
|
||||
#include <retro_inline.h>
|
||||
#include <string/stdstring.h>
|
||||
#include <gfx/math/matrix_4x4.h>
|
||||
|
||||
#include <defines/ps3_defines.h>
|
||||
|
||||
#ifdef __PSL1GHT__
|
||||
#include <rsx/rsx.h>
|
||||
#include <rsx/nv40.h>
|
||||
#include <ppu-types.h>
|
||||
#endif
|
||||
|
||||
#include "../../driver.h"
|
||||
#include "../../retroarch.h"
|
||||
#include "../video_coord_array.h"
|
||||
@ -35,7 +38,7 @@
|
||||
#define RSX_MAX_TEXTURES 4
|
||||
#define RSX_MAX_SHADERS 2
|
||||
#define RSX_MAX_VERTICES 4
|
||||
#define RSX_MAX_TEXTURE_VERTICES 4096 // Set > 0 for preallocated texture vertices
|
||||
#define RSX_MAX_TEXTURE_VERTICES 4096 /* Set > 0 for preallocated texture vertices */
|
||||
#define RSX_MAX_FONT_VERTICES 8192
|
||||
|
||||
#define RSX_SHADER_STOCK_BLEND (RSX_MAX_SHADERS - 1)
|
||||
@ -95,7 +98,8 @@ typedef struct
|
||||
uint32_t offset;
|
||||
} rsxBuffer;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
video_viewport_t vp;
|
||||
rsxBuffer buffers[RSX_MAX_BUFFERS];
|
||||
#if defined(HAVE_MENU_BUFFER)
|
||||
@ -104,15 +108,6 @@ typedef struct {
|
||||
#endif
|
||||
int currentBuffer, nextBuffer;
|
||||
gcmContextData* context;
|
||||
u16 width;
|
||||
u16 height;
|
||||
u16 menu_width;
|
||||
u16 menu_height;
|
||||
bool menu_frame_enable;
|
||||
bool rgb32;
|
||||
bool vsync;
|
||||
u32 depth_pitch;
|
||||
u32 depth_offset;
|
||||
u32* depth_buffer;
|
||||
|
||||
#if defined(HAVE_MENU_BUFFER)
|
||||
@ -120,11 +115,11 @@ typedef struct {
|
||||
#else
|
||||
gcmSurface surface[RSX_MAX_BUFFERS];
|
||||
#endif
|
||||
int tex_index;
|
||||
rsx_texture_t texture[RSX_MAX_TEXTURES];
|
||||
rsx_texture_t menu_texture;
|
||||
rsx_vertex_t *vertices;
|
||||
rsx_vertex_t *texture_vertices;
|
||||
int tex_index;
|
||||
int vert_idx;
|
||||
int texture_vert_idx;
|
||||
int font_vert_idx;
|
||||
@ -144,22 +139,33 @@ typedef struct {
|
||||
u32 *fp_buffer[RSX_MAX_SHADERS];
|
||||
u32 fp_offset[RSX_MAX_SHADERS];
|
||||
math_matrix_4x4 mvp, mvp_no_rot;
|
||||
float menu_texture_alpha;
|
||||
|
||||
bool smooth;
|
||||
unsigned rotation;
|
||||
bool keep_aspect;
|
||||
bool should_resize;
|
||||
bool msg_rendering_enabled;
|
||||
|
||||
const shader_backend_t* shader;
|
||||
void* shader_data;
|
||||
void* renderchain_data;
|
||||
void* ctx_data;
|
||||
const gfx_ctx_driver_t* ctx_driver;
|
||||
bool shared_context_use;
|
||||
|
||||
video_info_t video_info;
|
||||
|
||||
float menu_texture_alpha;
|
||||
|
||||
unsigned rotation;
|
||||
|
||||
u16 width;
|
||||
u16 height;
|
||||
u16 menu_width;
|
||||
u16 menu_height;
|
||||
u32 depth_pitch;
|
||||
u32 depth_offset;
|
||||
|
||||
bool menu_frame_enable;
|
||||
bool rgb32;
|
||||
bool vsync;
|
||||
bool smooth;
|
||||
bool keep_aspect;
|
||||
bool should_resize;
|
||||
bool msg_rendering_enabled;
|
||||
bool shared_context_use;
|
||||
} rsx_t;
|
||||
|
||||
#endif
|
||||
|
@ -16,6 +16,10 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <retro_inline.h>
|
||||
#include <retro_math.h>
|
||||
@ -50,24 +54,19 @@
|
||||
|
||||
#include <defines/ps3_defines.h>
|
||||
|
||||
#include <rsx/rsx.h>
|
||||
#include <rsx/nv40.h>
|
||||
#include <ppu-types.h>
|
||||
|
||||
#define CB_SIZE 0x100000
|
||||
#define HOST_SIZE (32*1024*1024)
|
||||
|
||||
#ifdef __PSL1GHT__
|
||||
#include <rsx/rsx.h>
|
||||
#include <rsx/nv40.h>
|
||||
#include <ppu-types.h>
|
||||
#include <ppu-lv2.h>
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sysutil/video.h>
|
||||
#include <rsx/gcm_sys.h>
|
||||
#include <rsx/rsx.h>
|
||||
#include <io/pad.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#endif
|
||||
|
||||
#define rsx_context_bind_hw_render(rsx, enable) \
|
||||
if (rsx->shared_context_use) \
|
||||
@ -83,15 +82,19 @@ static void rsx_load_texture_data(rsx_t* rsx, rsx_texture_t *texture,
|
||||
|
||||
if (!texture->data)
|
||||
{
|
||||
texture->data = (u32 *)rsxMemalign(128, texture->height * pitch);
|
||||
texture->data = (u32*)rsxMemalign(128, texture->height * pitch);
|
||||
rsxAddressToOffset(texture->data, &texture->offset);
|
||||
}
|
||||
|
||||
texbuffer = (u8*)texture->data;
|
||||
memcpy(texbuffer, data, height * pitch);
|
||||
|
||||
texture->tex.format = (rgb32 ? GCM_TEXTURE_FORMAT_A8R8G8B8 :
|
||||
menu ? GCM_TEXTURE_FORMAT_A4R4G4B4 : GCM_TEXTURE_FORMAT_R5G6B5) | GCM_TEXTURE_FORMAT_LIN;
|
||||
texture->tex.format = (rgb32
|
||||
? GCM_TEXTURE_FORMAT_A8R8G8B8 :
|
||||
(menu)
|
||||
? GCM_TEXTURE_FORMAT_A4R4G4B4
|
||||
: GCM_TEXTURE_FORMAT_R5G6B5)
|
||||
| GCM_TEXTURE_FORMAT_LIN;
|
||||
texture->tex.mipmap = 1;
|
||||
texture->tex.dimension = GCM_TEXTURE_DIMS_2D;
|
||||
texture->tex.cubemap = GCM_FALSE;
|
||||
@ -300,9 +303,9 @@ task_finder_data_t rsx_tasks_finder_data = {rsx_tasks_finder, NULL};
|
||||
|
||||
static int rsx_make_buffer(rsxBuffer * buffer, u16 width, u16 height, int id)
|
||||
{
|
||||
int depth = sizeof(u32);
|
||||
int pitch = depth * width;
|
||||
int size = depth * width * height;
|
||||
int depth = sizeof(u32);
|
||||
int pitch = depth * width;
|
||||
int size = depth * width * height;
|
||||
if (!(buffer->ptr = (uint32_t*)rsxMemalign (64, size)))
|
||||
goto error;
|
||||
|
||||
@ -381,8 +384,8 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
||||
|
||||
if (!saved_context)
|
||||
{
|
||||
/* Allocate a 1Mb buffer, alligned to a 1Mb boundary
|
||||
* to be our shared IO memory with the RSX. */
|
||||
/* Allocate a 1MB buffer, alligned to a 1MB boundary
|
||||
* to be our shared I/O memory with the RSX. */
|
||||
void *host_addr = memalign(1024*1024, HOST_SIZE);
|
||||
|
||||
if (!host_addr)
|
||||
@ -391,7 +394,7 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
||||
/* Initialise Reality, which sets up the
|
||||
* command buffer and shared I/O memory */
|
||||
#ifdef NV40TCL_RENDER_ENABLE
|
||||
/* There was an api breakage on 2020-07-10, let's
|
||||
/* There was an API breakage on 2020-07-10, let's
|
||||
* workaround this by using one of the new defines */
|
||||
rsxInit(&context, CB_SIZE, HOST_SIZE, host_addr);
|
||||
#else
|
||||
@ -486,44 +489,44 @@ static void rsx_init_render_target(rsx_t *rsx, rsxBuffer * buffer, int id)
|
||||
|
||||
static void rsx_init_vertices(rsx_t *rsx)
|
||||
{
|
||||
rsx->vertices = (rsx_vertex_t *)rsxMemalign(128, sizeof(rsx_vertex_t) * RSX_MAX_VERTICES); /* vertices for menu and core */
|
||||
rsx->vert_idx = 0;
|
||||
rsx->vertices = (rsx_vertex_t *)rsxMemalign(128, sizeof(rsx_vertex_t) * RSX_MAX_VERTICES); /* vertices for menu and core */
|
||||
rsx->vert_idx = 0;
|
||||
|
||||
rsx->vertices[0].x = 0.0f;
|
||||
rsx->vertices[0].y = 0.0f;
|
||||
rsx->vertices[0].u = 0.0f;
|
||||
rsx->vertices[0].v = 1.0f;
|
||||
rsx->vertices[0].r = 1.0f;
|
||||
rsx->vertices[0].g = 1.0f;
|
||||
rsx->vertices[0].b = 1.0f;
|
||||
rsx->vertices[0].a = 1.0f;
|
||||
rsx->vertices[0].x = 0.0f;
|
||||
rsx->vertices[0].y = 0.0f;
|
||||
rsx->vertices[0].u = 0.0f;
|
||||
rsx->vertices[0].v = 1.0f;
|
||||
rsx->vertices[0].r = 1.0f;
|
||||
rsx->vertices[0].g = 1.0f;
|
||||
rsx->vertices[0].b = 1.0f;
|
||||
rsx->vertices[0].a = 1.0f;
|
||||
|
||||
rsx->vertices[1].x = 1.0f;
|
||||
rsx->vertices[1].y = 0.0f;
|
||||
rsx->vertices[1].u = 1.0f;
|
||||
rsx->vertices[1].v = 1.0f;
|
||||
rsx->vertices[1].r = 1.0f;
|
||||
rsx->vertices[1].g = 1.0f;
|
||||
rsx->vertices[1].b = 1.0f;
|
||||
rsx->vertices[1].a = 1.0f;
|
||||
rsx->vertices[1].x = 1.0f;
|
||||
rsx->vertices[1].y = 0.0f;
|
||||
rsx->vertices[1].u = 1.0f;
|
||||
rsx->vertices[1].v = 1.0f;
|
||||
rsx->vertices[1].r = 1.0f;
|
||||
rsx->vertices[1].g = 1.0f;
|
||||
rsx->vertices[1].b = 1.0f;
|
||||
rsx->vertices[1].a = 1.0f;
|
||||
|
||||
rsx->vertices[2].x = 0.0f;
|
||||
rsx->vertices[2].y = 1.0f;
|
||||
rsx->vertices[2].u = 0.0f;
|
||||
rsx->vertices[2].v = 0.0f;
|
||||
rsx->vertices[2].r = 1.0f;
|
||||
rsx->vertices[2].g = 1.0f;
|
||||
rsx->vertices[2].b = 1.0f;
|
||||
rsx->vertices[2].a = 1.0f;
|
||||
rsx->vertices[2].x = 0.0f;
|
||||
rsx->vertices[2].y = 1.0f;
|
||||
rsx->vertices[2].u = 0.0f;
|
||||
rsx->vertices[2].v = 0.0f;
|
||||
rsx->vertices[2].r = 1.0f;
|
||||
rsx->vertices[2].g = 1.0f;
|
||||
rsx->vertices[2].b = 1.0f;
|
||||
rsx->vertices[2].a = 1.0f;
|
||||
|
||||
rsx->vertices[3].x = 1.0f;
|
||||
rsx->vertices[3].y = 1.0f;
|
||||
rsx->vertices[3].u = 1.0f;
|
||||
rsx->vertices[3].v = 0.0f;
|
||||
rsx->vertices[3].r = 1.0f;
|
||||
rsx->vertices[3].g = 1.0f;
|
||||
rsx->vertices[3].b = 1.0f;
|
||||
rsx->vertices[3].a = 1.0f;
|
||||
rsx->vertices[3].x = 1.0f;
|
||||
rsx->vertices[3].y = 1.0f;
|
||||
rsx->vertices[3].u = 1.0f;
|
||||
rsx->vertices[3].v = 0.0f;
|
||||
rsx->vertices[3].r = 1.0f;
|
||||
rsx->vertices[3].g = 1.0f;
|
||||
rsx->vertices[3].b = 1.0f;
|
||||
rsx->vertices[3].a = 1.0f;
|
||||
|
||||
#if RSX_MAX_TEXTURE_VERTICES > 0
|
||||
/* Using preallocated texture vertices */
|
||||
@ -534,18 +537,18 @@ static void rsx_init_vertices(rsx_t *rsx)
|
||||
|
||||
static void rsx_init_shader(rsx_t *rsx)
|
||||
{
|
||||
u32 fpsize = 0;
|
||||
u32 vpsize = 0;
|
||||
u32 fpsize = 0;
|
||||
u32 vpsize = 0;
|
||||
rsx->vp_ucode[RSX_SHADER_MENU] = NULL;
|
||||
rsx->fp_ucode[RSX_SHADER_MENU] = NULL;
|
||||
rsx->vpo[RSX_SHADER_MENU] = (rsxVertexProgram *)modern_opaque_vpo;
|
||||
rsx->fpo[RSX_SHADER_MENU] = (rsxFragmentProgram *)modern_opaque_fpo;
|
||||
rsxVertexProgramGetUCode(rsx->vpo[RSX_SHADER_MENU], &rsx->vp_ucode[RSX_SHADER_MENU], &vpsize);
|
||||
rsx->vpo[RSX_SHADER_MENU] = (rsxVertexProgram*)modern_opaque_vpo;
|
||||
rsx->fpo[RSX_SHADER_MENU] = (rsxFragmentProgram*)modern_opaque_fpo;
|
||||
rsxVertexProgramGetUCode( rsx->vpo[RSX_SHADER_MENU], &rsx->vp_ucode[RSX_SHADER_MENU], &vpsize);
|
||||
rsxFragmentProgramGetUCode(rsx->fpo[RSX_SHADER_MENU], &rsx->fp_ucode[RSX_SHADER_MENU], &fpsize);
|
||||
rsx->fp_buffer[RSX_SHADER_MENU] = (u32 *)rsxMemalign(64, fpsize);
|
||||
rsx->fp_buffer[RSX_SHADER_MENU] = (u32*)rsxMemalign(64, fpsize);
|
||||
if (!rsx->fp_buffer[RSX_SHADER_MENU])
|
||||
{
|
||||
RARCH_LOG("failed to allocate fp_buffer\n");
|
||||
RARCH_ERR("failed to allocate fp_buffer\n");
|
||||
return;
|
||||
}
|
||||
memcpy(rsx->fp_buffer[RSX_SHADER_MENU], rsx->fp_ucode[RSX_SHADER_MENU], fpsize);
|
||||
@ -565,7 +568,7 @@ static void rsx_init_shader(rsx_t *rsx)
|
||||
rsx->fp_buffer[RSX_SHADER_STOCK_BLEND] = (u32 *)rsxMemalign(64, fpsize);
|
||||
if (!rsx->fp_buffer[RSX_SHADER_STOCK_BLEND])
|
||||
{
|
||||
RARCH_LOG("failed to allocate fp_buffer\n");
|
||||
RARCH_ERR("failed to allocate fp_buffer\n");
|
||||
return;
|
||||
}
|
||||
memcpy(rsx->fp_buffer[RSX_SHADER_STOCK_BLEND], rsx->fp_ucode[RSX_SHADER_STOCK_BLEND], fpsize);
|
||||
@ -582,7 +585,8 @@ static void* rsx_init(const video_info_t* video,
|
||||
input_driver_t** input, void** input_data)
|
||||
{
|
||||
int i;
|
||||
rsx_t* rsx = malloc(sizeof(rsx_t));
|
||||
const gfx_ctx_driver_t* ctx_driver = NULL;
|
||||
rsx_t* rsx = (rsx_t*)malloc(sizeof(rsx_t));
|
||||
|
||||
if (!rsx)
|
||||
return NULL;
|
||||
@ -590,10 +594,12 @@ static void* rsx_init(const video_info_t* video,
|
||||
memset(rsx, 0, sizeof(rsx_t));
|
||||
|
||||
rsx->context = rsx_init_screen(rsx);
|
||||
const gfx_ctx_driver_t* ctx_driver = rsx_get_context(rsx);
|
||||
|
||||
if (!ctx_driver)
|
||||
if (!(ctx_driver = rsx_get_context(rsx)))
|
||||
{
|
||||
free(rsx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
video_context_driver_set((const gfx_ctx_driver_t*)ctx_driver);
|
||||
rsx->ctx_driver = ctx_driver;
|
||||
@ -875,9 +881,10 @@ static void rsx_blit_buffer(
|
||||
int j, l;
|
||||
for (j = 0; j < width; j++, src++)
|
||||
{
|
||||
int k;
|
||||
u32 c = *src;
|
||||
for (int k = 0; k < scale; k++, dst++)
|
||||
for (int l = 0; l < scale; l++)
|
||||
for (k = 0; k < scale; k++, dst++)
|
||||
for (l = 0; l < scale; l++)
|
||||
dst[l * buffer->width] = c;
|
||||
}
|
||||
for (l = 0; l < scale; l++)
|
||||
@ -886,13 +893,16 @@ static void rsx_blit_buffer(
|
||||
dst += buffer->width * scale - width * scale;
|
||||
src += pitch / 4 - width;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
const uint16_t *src = frame;
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (int j = 0; j < width; j++, src++)
|
||||
int j, l;
|
||||
for (j = 0; j < width; j++, src++)
|
||||
{
|
||||
int k, l;
|
||||
int k;
|
||||
u16 rgb565 = *src;
|
||||
u8 r = ((rgb565 >> 8) & 0xf8);
|
||||
u8 g = ((rgb565 >> 3) & 0xfc);
|
||||
@ -902,7 +912,7 @@ static void rsx_blit_buffer(
|
||||
for (l = 0; l < scale; l++)
|
||||
dst[l * buffer->width] = c;
|
||||
}
|
||||
for (int l = 0; l < scale; l++)
|
||||
for (l = 0; l < scale; l++)
|
||||
rsx_fill_black(dst + l * buffer->width, dst_end, buffer->width - width * scale);
|
||||
|
||||
dst += buffer->width * scale - width * scale;
|
||||
@ -1085,7 +1095,7 @@ static void rsx_draw_menu_vertices(rsx_t* rsx)
|
||||
rsxAddressToOffset(&vertices[rsx->vert_idx].x, &rsx->pos_offset[RSX_SHADER_STOCK_BLEND]);
|
||||
rsxAddressToOffset(&vertices[rsx->vert_idx].u, &rsx->uv_offset[RSX_SHADER_STOCK_BLEND]);
|
||||
rsxAddressToOffset(&vertices[rsx->vert_idx].r, &rsx->col_offset[RSX_SHADER_STOCK_BLEND]);
|
||||
rsx->vert_idx = end_vert_idx;
|
||||
rsx->vert_idx = end_vert_idx;
|
||||
|
||||
rsxBindVertexArrayAttrib(rsx->context, rsx->pos_index[RSX_SHADER_STOCK_BLEND]->index, 0,
|
||||
rsx->pos_offset[RSX_SHADER_STOCK_BLEND], sizeof(rsx_vertex_t), 2, GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||
@ -1116,20 +1126,16 @@ static void rsx_update_screen(rsx_t* gcm)
|
||||
if (gcm->menu_frame_enable)
|
||||
{
|
||||
buffer = &gcm->menuBuffers[gcm->menuBuffer];
|
||||
gcm->menuBuffer = (gcm->menuBuffer+1)%RSX_MAX_MENU_BUFFERS;
|
||||
gcm->menuBuffer = (gcm->menuBuffer + 1) % RSX_MAX_MENU_BUFFERS;
|
||||
gcm->nextBuffer = RSX_MAX_BUFFERS + gcm->menuBuffer;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
buffer = &gcm->buffers[gcm->currentBuffer];
|
||||
gcm->currentBuffer = (gcm->currentBuffer+1)%RSX_MAX_BUFFERS;
|
||||
gcm->currentBuffer = (gcm->currentBuffer + 1) % RSX_MAX_BUFFERS;
|
||||
gcm->nextBuffer = gcm->currentBuffer;
|
||||
}
|
||||
#else
|
||||
buffer = &gcm->buffers[gcm->currentBuffer];
|
||||
gcm->currentBuffer = (gcm->currentBuffer+1)%RSX_MAX_BUFFERS;
|
||||
gcm->nextBuffer = gcm->currentBuffer;
|
||||
#endif
|
||||
|
||||
rsx_flip(gcm->context, buffer->id);
|
||||
if (gcm->vsync)
|
||||
@ -1182,6 +1188,8 @@ static bool rsx_frame(void* data, const void* frame,
|
||||
gcm->tex_index = ((gcm->tex_index + 1) % RSX_MAX_TEXTURES);
|
||||
rsx_load_texture_data(gcm, &gcm->texture[gcm->tex_index], frame, width, height, pitch, gcm->rgb32, false,
|
||||
gcm->smooth ? TEXTURE_FILTER_LINEAR : TEXTURE_FILTER_NEAREST);
|
||||
/* TODO/FIXME - pipeline ID being used here is RSX_SHADER_MENU, shouldn't
|
||||
* this be RSX_SHADER_STOCK_BLEND instead? */
|
||||
rsx_set_texture(gcm, &gcm->texture[gcm->tex_index]);
|
||||
rsx_draw_vertices(gcm);
|
||||
draw = true;
|
||||
@ -1193,6 +1201,8 @@ static bool rsx_frame(void* data, const void* frame,
|
||||
menu_driver_frame(menu_is_alive, video_info);
|
||||
if (gcm->menu_texture.data)
|
||||
{
|
||||
/* TODO/FIXME - pipeline ID being used here is RSX_SHADER_STOCK_BLEND, shouldn't
|
||||
* this be RSX_SHADER_MENU instead? */
|
||||
rsx_set_menu_texture(gcm, &gcm->menu_texture);
|
||||
rsx_draw_menu_vertices(gcm);
|
||||
draw = true;
|
||||
|
@ -14,16 +14,18 @@
|
||||
*/
|
||||
|
||||
#include <defines/ps3_defines.h>
|
||||
#include <encodings/utf.h>
|
||||
|
||||
#ifdef __PSL1GHT__
|
||||
#include <rsx/rsx.h>
|
||||
#include <rsx/nv40.h>
|
||||
#include <ppu-types.h>
|
||||
|
||||
#include <encodings/utf.h>
|
||||
|
||||
#include "../common/rsx_common.h"
|
||||
#endif
|
||||
|
||||
#include "../font_driver.h"
|
||||
|
||||
#include "../common/rsx_common.h"
|
||||
|
||||
#include "../../configuration.h"
|
||||
|
||||
#define RSX_FONT_EMIT(c, vx, vy) \
|
||||
@ -43,8 +45,6 @@ typedef struct
|
||||
rsx_t *rsx;
|
||||
rsx_vertex_t *vertices;
|
||||
rsx_texture_t texture;
|
||||
u32 tex_width;
|
||||
u32 tex_height;
|
||||
rsxProgramConst *proj_matrix;
|
||||
rsxProgramAttrib *pos_index;
|
||||
rsxProgramAttrib *uv_index;
|
||||
@ -52,16 +52,18 @@ typedef struct
|
||||
rsxProgramAttrib *tex_unit;
|
||||
rsxVertexProgram* vpo;
|
||||
rsxFragmentProgram* fpo;
|
||||
u32 fp_offset;
|
||||
u32 pos_offset;
|
||||
u32 uv_offset;
|
||||
u32 col_offset;
|
||||
void *vp_ucode;
|
||||
void *fp_ucode;
|
||||
const font_renderer_driver_t *font_driver;
|
||||
void *font_data;
|
||||
struct font_atlas *atlas;
|
||||
video_font_raster_block_t *block;
|
||||
u32 tex_width;
|
||||
u32 tex_height;
|
||||
u32 fp_offset;
|
||||
u32 pos_offset;
|
||||
u32 uv_offset;
|
||||
u32 col_offset;
|
||||
} rsx_font_t;
|
||||
|
||||
static void rsx_font_free(void *data,
|
||||
@ -97,38 +99,44 @@ static void rsx_font_free(void *data,
|
||||
|
||||
static bool rsx_font_upload_atlas(rsx_font_t *font)
|
||||
{
|
||||
u8 *texbuffer = (u8 *)font->texture.data;
|
||||
const u8 *atlas_data = (u8 *)font->atlas->buffer;
|
||||
u8 *texbuffer = (u8 *)font->texture.data;
|
||||
const u8 *atlas_data = (u8 *)font->atlas->buffer;
|
||||
memcpy(texbuffer, atlas_data, font->atlas->height * font->atlas->width);
|
||||
|
||||
font->texture.tex.format = GCM_TEXTURE_FORMAT_B8 | GCM_TEXTURE_FORMAT_LIN;
|
||||
font->texture.tex.mipmap = 1;
|
||||
font->texture.tex.dimension = GCM_TEXTURE_DIMS_2D;
|
||||
font->texture.tex.cubemap = GCM_FALSE;
|
||||
font->texture.tex.remap = ((GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_B_SHIFT) |
|
||||
(GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_G_SHIFT) |
|
||||
(GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_R_SHIFT) |
|
||||
(GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_A_SHIFT) |
|
||||
(GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_B_SHIFT) |
|
||||
(GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_G_SHIFT) |
|
||||
(GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_R_SHIFT) |
|
||||
(GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_A_SHIFT));
|
||||
font->texture.tex.width = font->tex_width;
|
||||
font->texture.tex.height = font->tex_height;
|
||||
font->texture.tex.depth = 1;
|
||||
font->texture.tex.pitch = font->tex_width;
|
||||
font->texture.tex.location = GCM_LOCATION_RSX;
|
||||
font->texture.tex.offset = font->texture.offset;
|
||||
font->texture.wrap_s = GCM_TEXTURE_CLAMP_TO_EDGE;
|
||||
font->texture.wrap_t = GCM_TEXTURE_CLAMP_TO_EDGE;
|
||||
font->texture.min_filter = GCM_TEXTURE_LINEAR;
|
||||
font->texture.mag_filter = GCM_TEXTURE_LINEAR;
|
||||
font->texture.tex.format = GCM_TEXTURE_FORMAT_B8 | GCM_TEXTURE_FORMAT_LIN;
|
||||
font->texture.tex.mipmap = 1;
|
||||
font->texture.tex.dimension = GCM_TEXTURE_DIMS_2D;
|
||||
font->texture.tex.cubemap = GCM_FALSE;
|
||||
font->texture.tex.remap = (
|
||||
(GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_B_SHIFT)
|
||||
| (GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_G_SHIFT)
|
||||
| (GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_R_SHIFT)
|
||||
| (GCM_TEXTURE_REMAP_TYPE_REMAP << GCM_TEXTURE_REMAP_TYPE_A_SHIFT)
|
||||
| (GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_B_SHIFT)
|
||||
| (GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_G_SHIFT)
|
||||
| (GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_R_SHIFT)
|
||||
| (GCM_TEXTURE_REMAP_COLOR_B << GCM_TEXTURE_REMAP_COLOR_A_SHIFT));
|
||||
font->texture.tex.width = font->tex_width;
|
||||
font->texture.tex.height = font->tex_height;
|
||||
font->texture.tex.depth = 1;
|
||||
font->texture.tex.pitch = font->tex_width;
|
||||
font->texture.tex.location = GCM_LOCATION_RSX;
|
||||
font->texture.tex.offset = font->texture.offset;
|
||||
font->texture.wrap_s = GCM_TEXTURE_CLAMP_TO_EDGE;
|
||||
font->texture.wrap_t = GCM_TEXTURE_CLAMP_TO_EDGE;
|
||||
font->texture.min_filter = GCM_TEXTURE_LINEAR;
|
||||
font->texture.mag_filter = GCM_TEXTURE_LINEAR;
|
||||
|
||||
rsxInvalidateTextureCache(font->rsx->context, GCM_INVALIDATE_TEXTURE);
|
||||
rsxLoadTexture(font->rsx->context, font->tex_unit->index, &font->texture.tex);
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index, GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
rsxTextureFilter(font->rsx->context, font->tex_unit->index, 0, font->texture.min_filter, font->texture.mag_filter, GCM_TEXTURE_CONVOLUTION_QUINCUNX);
|
||||
rsxTextureWrapMode(font->rsx->context, font->tex_unit->index, font->texture.wrap_s, font->texture.wrap_t, GCM_TEXTURE_CLAMP_TO_EDGE, 0, GCM_TEXTURE_ZFUNC_LESS, 0);
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index,
|
||||
GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
rsxTextureFilter(font->rsx->context, font->tex_unit->index,
|
||||
0, font->texture.min_filter,
|
||||
font->texture.mag_filter, GCM_TEXTURE_CONVOLUTION_QUINCUNX);
|
||||
rsxTextureWrapMode(font->rsx->context, font->tex_unit->index,
|
||||
font->texture.wrap_s, font->texture.wrap_t,
|
||||
GCM_TEXTURE_CLAMP_TO_EDGE, 0, GCM_TEXTURE_ZFUNC_LESS, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -137,12 +145,12 @@ static void *rsx_font_init(void *data,
|
||||
const char *font_path, float font_size,
|
||||
bool is_threaded)
|
||||
{
|
||||
rsx_font_t *font = (rsx_font_t*)calloc(1, sizeof(*font));
|
||||
rsx_font_t *font = (rsx_font_t*)calloc(1, sizeof(*font));
|
||||
|
||||
if (!font)
|
||||
return NULL;
|
||||
|
||||
font->rsx = (rsx_t *)data;
|
||||
font->rsx = (rsx_t *)data;
|
||||
|
||||
if (!font_renderer_create_default(
|
||||
&font->font_driver,
|
||||
@ -154,31 +162,32 @@ static void *rsx_font_init(void *data,
|
||||
|
||||
if (is_threaded)
|
||||
if (
|
||||
font->rsx &&
|
||||
font->rsx->ctx_driver &&
|
||||
font->rsx->ctx_driver->make_current)
|
||||
font->rsx
|
||||
&& font->rsx->ctx_driver
|
||||
&& font->rsx->ctx_driver->make_current)
|
||||
font->rsx->ctx_driver->make_current(false);
|
||||
|
||||
font->atlas = font->font_driver->get_atlas(font->font_data);
|
||||
font->atlas = font->font_driver->get_atlas(font->font_data);
|
||||
|
||||
font->vpo = font->rsx->vpo[RSX_SHADER_STOCK_BLEND];
|
||||
font->fpo = font->rsx->fpo[RSX_SHADER_STOCK_BLEND];
|
||||
font->fp_ucode = font->rsx->fp_ucode[RSX_SHADER_STOCK_BLEND];
|
||||
font->vp_ucode = font->rsx->vp_ucode[RSX_SHADER_STOCK_BLEND];
|
||||
font->fp_offset = font->rsx->fp_offset[RSX_SHADER_STOCK_BLEND];
|
||||
font->vpo = font->rsx->vpo[RSX_SHADER_STOCK_BLEND];
|
||||
font->fpo = font->rsx->fpo[RSX_SHADER_STOCK_BLEND];
|
||||
font->fp_ucode = font->rsx->fp_ucode[RSX_SHADER_STOCK_BLEND];
|
||||
font->vp_ucode = font->rsx->vp_ucode[RSX_SHADER_STOCK_BLEND];
|
||||
font->fp_offset = font->rsx->fp_offset[RSX_SHADER_STOCK_BLEND];
|
||||
|
||||
font->proj_matrix = font->rsx->proj_matrix[RSX_SHADER_STOCK_BLEND];
|
||||
font->pos_index = font->rsx->pos_index[RSX_SHADER_STOCK_BLEND];
|
||||
font->uv_index = font->rsx->uv_index[RSX_SHADER_STOCK_BLEND];
|
||||
font->col_index = font->rsx->col_index[RSX_SHADER_STOCK_BLEND];
|
||||
font->tex_unit = font->rsx->tex_unit[RSX_SHADER_STOCK_BLEND];
|
||||
font->proj_matrix = font->rsx->proj_matrix[RSX_SHADER_STOCK_BLEND];
|
||||
font->pos_index = font->rsx->pos_index[RSX_SHADER_STOCK_BLEND];
|
||||
font->uv_index = font->rsx->uv_index[RSX_SHADER_STOCK_BLEND];
|
||||
font->col_index = font->rsx->col_index[RSX_SHADER_STOCK_BLEND];
|
||||
font->tex_unit = font->rsx->tex_unit[RSX_SHADER_STOCK_BLEND];
|
||||
|
||||
font->vertices = (rsx_vertex_t *)rsxMemalign(128, sizeof(rsx_vertex_t) * RSX_MAX_FONT_VERTICES);
|
||||
font->vertices = (rsx_vertex_t *)rsxMemalign(128,
|
||||
sizeof(rsx_vertex_t) * RSX_MAX_FONT_VERTICES);
|
||||
font->rsx->font_vert_idx = 0;
|
||||
|
||||
font->tex_width = font->atlas->width;
|
||||
font->tex_height = font->atlas->height;
|
||||
font->texture.data = (u32 *)rsxMemalign(128, (font->tex_height * font->tex_width));
|
||||
font->tex_width = font->atlas->width;
|
||||
font->tex_height = font->atlas->height;
|
||||
font->texture.data = (u32*)rsxMemalign(128, (font->tex_height * font->tex_width));
|
||||
rsxAddressToOffset(font->texture.data, &font->texture.offset);
|
||||
|
||||
if (!font->texture.data)
|
||||
@ -189,7 +198,8 @@ static void *rsx_font_init(void *data,
|
||||
|
||||
font->atlas->dirty = false;
|
||||
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index, GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index,
|
||||
GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
return font;
|
||||
|
||||
error:
|
||||
@ -216,7 +226,7 @@ static int rsx_font_get_message_width(void *data, const char *msg,
|
||||
while (msg < msg_end)
|
||||
{
|
||||
const struct font_glyph *glyph;
|
||||
unsigned code = utf8_walk(&msg);
|
||||
unsigned code = utf8_walk(&msg);
|
||||
|
||||
/* Do something smarter here ... */
|
||||
if (!(glyph = font->font_driver->get_glyph(
|
||||
@ -233,7 +243,8 @@ static int rsx_font_get_message_width(void *data, const char *msg,
|
||||
static void rsx_font_draw_vertices(rsx_font_t *font,
|
||||
const video_coords_t *coords)
|
||||
{
|
||||
int i;
|
||||
int i, end_vert_idx;
|
||||
rsx_vertex_t *vertices = NULL;
|
||||
const float *vertex = coords->vertex;
|
||||
const float *tex_coord = coords->tex_coord;
|
||||
const float *color = coords->color;
|
||||
@ -241,16 +252,18 @@ static void rsx_font_draw_vertices(rsx_font_t *font,
|
||||
if (font->atlas->dirty)
|
||||
{
|
||||
rsx_font_upload_atlas(font);
|
||||
font->atlas->dirty = false;
|
||||
font->atlas->dirty = false;
|
||||
}
|
||||
|
||||
int end_vert_idx = font->rsx->font_vert_idx + coords->vertices;
|
||||
end_vert_idx = font->rsx->font_vert_idx + coords->vertices;
|
||||
if (end_vert_idx > RSX_MAX_FONT_VERTICES)
|
||||
{
|
||||
font->rsx->font_vert_idx = 0;
|
||||
end_vert_idx = font->rsx->font_vert_idx + coords->vertices;
|
||||
font->rsx->font_vert_idx = 0;
|
||||
end_vert_idx = font->rsx->font_vert_idx + coords->vertices;
|
||||
}
|
||||
rsx_vertex_t *vertices = &font->vertices[font->rsx->font_vert_idx];
|
||||
|
||||
vertices = &font->vertices[font->rsx->font_vert_idx];
|
||||
|
||||
for (i = font->rsx->font_vert_idx; i < end_vert_idx; i++)
|
||||
{
|
||||
vertices[i].x = *vertex++;
|
||||
@ -262,18 +275,27 @@ static void rsx_font_draw_vertices(rsx_font_t *font,
|
||||
vertices[i].b = *color++;
|
||||
vertices[i].a = *color++;
|
||||
}
|
||||
|
||||
rsxAddressToOffset(&vertices[font->rsx->font_vert_idx].x, &font->pos_offset);
|
||||
rsxAddressToOffset(&vertices[font->rsx->font_vert_idx].u, &font->uv_offset);
|
||||
rsxAddressToOffset(&vertices[font->rsx->font_vert_idx].r, &font->col_offset);
|
||||
font->rsx->font_vert_idx = end_vert_idx;
|
||||
|
||||
rsxBindVertexArrayAttrib(font->rsx->context, font->pos_index->index, 0, font->pos_offset, sizeof(rsx_vertex_t), 2, GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||
rsxBindVertexArrayAttrib(font->rsx->context, font->uv_index->index, 0, font->uv_offset, sizeof(rsx_vertex_t), 2, GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||
rsxBindVertexArrayAttrib(font->rsx->context, font->col_index->index, 0, font->col_offset, sizeof(rsx_vertex_t), 4, GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||
rsxBindVertexArrayAttrib(font->rsx->context, font->pos_index->index, 0,
|
||||
font->pos_offset, sizeof(rsx_vertex_t), 2,
|
||||
GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||
rsxBindVertexArrayAttrib(font->rsx->context, font->uv_index->index, 0,
|
||||
font->uv_offset, sizeof(rsx_vertex_t), 2,
|
||||
GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||
rsxBindVertexArrayAttrib(font->rsx->context, font->col_index->index, 0,
|
||||
font->col_offset, sizeof(rsx_vertex_t), 4,
|
||||
GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||
|
||||
rsxLoadVertexProgram(font->rsx->context, font->vpo, font->vp_ucode);
|
||||
rsxSetVertexProgramParameter(font->rsx->context, font->vpo, font->proj_matrix, (float *)&font->rsx->mvp_no_rot);
|
||||
rsxLoadFragmentProgramLocation(font->rsx->context, font->fpo, font->fp_offset, GCM_LOCATION_RSX);
|
||||
rsxSetVertexProgramParameter(font->rsx->context, font->vpo,
|
||||
font->proj_matrix, (float *)&font->rsx->mvp_no_rot);
|
||||
rsxLoadFragmentProgramLocation(font->rsx->context, font->fpo,
|
||||
font->fp_offset, GCM_LOCATION_RSX);
|
||||
|
||||
rsxClearSurface(font->rsx->context, GCM_CLEAR_Z);
|
||||
rsxDrawVertexArray(font->rsx->context, GCM_TYPE_TRIANGLES, 0, coords->vertices);
|
||||
@ -288,8 +310,8 @@ static void rsx_font_render_line(
|
||||
struct video_coords coords;
|
||||
const struct font_glyph* glyph_q = NULL;
|
||||
float font_tex_coords[2 * 6 * MAX_MSG_LEN_CHUNK];
|
||||
float font_vertex[2 * 6 * MAX_MSG_LEN_CHUNK];
|
||||
float font_color[4 * 6 * MAX_MSG_LEN_CHUNK];
|
||||
float font_vertex [2 * 6 * MAX_MSG_LEN_CHUNK];
|
||||
float font_color [4 * 6 * MAX_MSG_LEN_CHUNK];
|
||||
rsx_t *rsx = font->rsx;
|
||||
const char* msg_end = msg + msg_len;
|
||||
int x = roundf(pos_x * rsx->vp.width);
|
||||
@ -304,10 +326,10 @@ static void rsx_font_render_line(
|
||||
switch (text_align)
|
||||
{
|
||||
case TEXT_ALIGN_RIGHT:
|
||||
x -= rsx_font_get_message_width(font, msg, msg_len, scale);
|
||||
x -= rsx_font_get_message_width(font, msg, msg_len, scale);
|
||||
break;
|
||||
case TEXT_ALIGN_CENTER:
|
||||
x -= rsx_font_get_message_width(font, msg, msg_len, scale) / 2.0;
|
||||
x -= rsx_font_get_message_width(font, msg, msg_len, scale) / 2.0;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -373,7 +395,7 @@ static void rsx_font_render_message(
|
||||
|
||||
/* If font line metrics are not supported just draw as usual */
|
||||
if (!font->font_driver->get_line_metrics ||
|
||||
!font->font_driver->get_line_metrics(font->font_data, &line_metrics))
|
||||
!font->font_driver->get_line_metrics(font->font_data, &line_metrics))
|
||||
{
|
||||
rsx_font_render_line(font,
|
||||
msg, strlen(msg), scale, color, pos_x,
|
||||
@ -407,15 +429,17 @@ static void rsx_font_setup_viewport(unsigned width, unsigned height,
|
||||
{
|
||||
video_driver_set_viewport(width, height, full_screen, false);
|
||||
|
||||
if (font->rsx)
|
||||
{
|
||||
rsxSetBlendEnable(font->rsx->context, GCM_TRUE);
|
||||
rsxSetBlendFunc(font->rsx->context, GCM_SRC_ALPHA, GCM_ONE_MINUS_SRC_ALPHA, GCM_SRC_ALPHA, GCM_ONE_MINUS_SRC_ALPHA);
|
||||
rsxSetBlendEquation(font->rsx->context, GCM_FUNC_ADD, GCM_FUNC_ADD);
|
||||
if (font->rsx)
|
||||
{
|
||||
rsxSetBlendEnable(font->rsx->context, GCM_TRUE);
|
||||
rsxSetBlendFunc(font->rsx->context, GCM_SRC_ALPHA,
|
||||
GCM_ONE_MINUS_SRC_ALPHA, GCM_SRC_ALPHA, GCM_ONE_MINUS_SRC_ALPHA);
|
||||
rsxSetBlendEquation(font->rsx->context, GCM_FUNC_ADD, GCM_FUNC_ADD);
|
||||
|
||||
rsxLoadTexture(font->rsx->context, font->tex_unit->index, &font->texture.tex);
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index, GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
}
|
||||
rsxLoadTexture(font->rsx->context, font->tex_unit->index, &font->texture.tex);
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index,
|
||||
GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
}
|
||||
}
|
||||
|
||||
static void rsx_font_render_msg(
|
||||
@ -503,7 +527,7 @@ static void rsx_font_render_msg(
|
||||
|
||||
rsx_font_render_message(font, msg, scale, color_dark,
|
||||
x + scale * drop_x / font->rsx->vp.width, y +
|
||||
scale * drop_y / font->rsx->vp.height, text_align);
|
||||
scale * drop_y / font->rsx->vp.height, text_align);
|
||||
}
|
||||
|
||||
rsx_font_render_message(font, msg, scale, color,
|
||||
@ -512,8 +536,9 @@ static void rsx_font_render_msg(
|
||||
|
||||
if (!font->block)
|
||||
{
|
||||
/* restore viewport */
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index, GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
/* Restore viewport */
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index,
|
||||
GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
rsxSetBlendEnable(font->rsx->context, GCM_FALSE);
|
||||
video_driver_set_viewport(width, height, false, true);
|
||||
}
|
||||
@ -544,8 +569,9 @@ static void rsx_font_flush_block(unsigned width, unsigned height,
|
||||
|
||||
if (font->rsx)
|
||||
{
|
||||
/* restore viewport */
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index, GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
/* Restore viewport */
|
||||
rsxTextureControl(font->rsx->context, font->tex_unit->index,
|
||||
GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||
rsxSetBlendEnable(font->rsx->context, GCM_FALSE);
|
||||
video_driver_set_viewport(width, height, block->fullscreen, true);
|
||||
}
|
||||
|
@ -772,6 +772,10 @@ typedef struct KbData
|
||||
#else
|
||||
#define cellGcmSetTransferImage cellGcmSetTransferImageInline
|
||||
#define celGcmSetInvalidateVertexCache cellGcmSetInvalidateVertexCacheInline
|
||||
#define rsxInit cellGcmInit
|
||||
#define rsxInvalidateTextureCache(a, b) cellGcmSetInvalidateVertexCache(a)
|
||||
#define rsxTextureControl cellGcmSetTextureControlInline
|
||||
#define rsxSetBlendEnable cellGcmSetBlendEnableInline
|
||||
#endif
|
||||
|
||||
/*============================================================
|
||||
|
Loading…
x
Reference in New Issue
Block a user