mirror of
https://github.com/libretro/RetroArch
synced 2025-04-07 13:23:32 +00:00
(RSX) Style nits
This commit is contained in:
parent
35fa25bed6
commit
f8db0b86a9
@ -73,11 +73,169 @@
|
|||||||
if (rsx->shared_context_use) \
|
if (rsx->shared_context_use) \
|
||||||
rsx->ctx_driver->bind_hw_render(rsx->ctx_data, enable)
|
rsx->ctx_driver->bind_hw_render(rsx->ctx_data, enable)
|
||||||
|
|
||||||
static void rsx_set_viewport(void *data, unsigned viewport_width,
|
|
||||||
unsigned viewport_height, bool force_full, bool allow_rotate);
|
|
||||||
static void rsx_load_texture_data(rsx_t* rsx, rsx_texture_t *texture,
|
static void rsx_load_texture_data(rsx_t* rsx, rsx_texture_t *texture,
|
||||||
const void *frame, unsigned width, unsigned height, unsigned pitch,
|
const void *frame, unsigned width, unsigned height, unsigned pitch,
|
||||||
bool rgb32, bool menu, enum texture_filter_type filter_type);
|
bool rgb32, bool menu, enum texture_filter_type filter_type)
|
||||||
|
{
|
||||||
|
u8 *texbuffer;
|
||||||
|
u32 mag_filter, min_filter;
|
||||||
|
const u8 *data = (u8*)frame;
|
||||||
|
|
||||||
|
if (!texture->data)
|
||||||
|
{
|
||||||
|
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.mipmap = 1;
|
||||||
|
texture->tex.dimension = GCM_TEXTURE_DIMS_2D;
|
||||||
|
texture->tex.cubemap = GCM_FALSE;
|
||||||
|
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_G << GCM_TEXTURE_REMAP_COLOR_G_SHIFT)
|
||||||
|
| (GCM_TEXTURE_REMAP_COLOR_R << GCM_TEXTURE_REMAP_COLOR_R_SHIFT)
|
||||||
|
| (GCM_TEXTURE_REMAP_COLOR_A << GCM_TEXTURE_REMAP_COLOR_A_SHIFT));
|
||||||
|
texture->tex.width = width;
|
||||||
|
texture->tex.height = height;
|
||||||
|
texture->tex.depth = 1;
|
||||||
|
texture->tex.location = GCM_LOCATION_RSX;
|
||||||
|
texture->tex.pitch = pitch;
|
||||||
|
texture->tex.offset = texture->offset;
|
||||||
|
|
||||||
|
switch (filter_type)
|
||||||
|
{
|
||||||
|
case TEXTURE_FILTER_MIPMAP_NEAREST:
|
||||||
|
case TEXTURE_FILTER_NEAREST:
|
||||||
|
min_filter = GCM_TEXTURE_NEAREST;
|
||||||
|
mag_filter = GCM_TEXTURE_NEAREST;
|
||||||
|
break;
|
||||||
|
case TEXTURE_FILTER_MIPMAP_LINEAR:
|
||||||
|
case TEXTURE_FILTER_LINEAR:
|
||||||
|
default:
|
||||||
|
min_filter = GCM_TEXTURE_LINEAR;
|
||||||
|
mag_filter = GCM_TEXTURE_LINEAR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
texture->min_filter = min_filter;
|
||||||
|
texture->mag_filter = mag_filter;
|
||||||
|
texture->wrap_s = GCM_TEXTURE_CLAMP_TO_EDGE;
|
||||||
|
texture->wrap_t = GCM_TEXTURE_CLAMP_TO_EDGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rsx_set_viewport(void *data, unsigned viewport_width,
|
||||||
|
unsigned viewport_height, bool force_full, bool allow_rotate)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
rsx_viewport_t vp;
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
float device_aspect = (float)viewport_width / viewport_height;
|
||||||
|
struct video_ortho ortho = {0, 1, 0, 1, -1, 1};
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
rsx_t *rsx = (rsx_t*)data;
|
||||||
|
bool video_scale_integer = settings->bools.video_scale_integer;
|
||||||
|
unsigned aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
|
||||||
|
|
||||||
|
if (video_scale_integer && !force_full)
|
||||||
|
{
|
||||||
|
video_viewport_get_scaled_integer(&rsx->vp,
|
||||||
|
viewport_width, viewport_height,
|
||||||
|
video_driver_get_aspect_ratio(), rsx->keep_aspect);
|
||||||
|
viewport_width = rsx->vp.width;
|
||||||
|
viewport_height = rsx->vp.height;
|
||||||
|
}
|
||||||
|
else if (rsx->keep_aspect && !force_full)
|
||||||
|
{
|
||||||
|
float desired_aspect = video_driver_get_aspect_ratio();
|
||||||
|
|
||||||
|
#if defined(HAVE_MENU)
|
||||||
|
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
|
||||||
|
{
|
||||||
|
const struct video_viewport *custom = video_viewport_get_custom();
|
||||||
|
|
||||||
|
x = custom->x;
|
||||||
|
y = custom->y;
|
||||||
|
viewport_width = custom->width;
|
||||||
|
viewport_height = custom->height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
float delta;
|
||||||
|
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
|
||||||
|
{
|
||||||
|
/* If the aspect ratios of screen and desired aspect
|
||||||
|
* ratio are sufficiently equal (floating point stuff),
|
||||||
|
* assume they are actually equal.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else if (device_aspect > desired_aspect)
|
||||||
|
{
|
||||||
|
delta = (desired_aspect / device_aspect - 1.0f)
|
||||||
|
/ 2.0f + 0.5f;
|
||||||
|
x = (int)roundf(viewport_width * (0.5f - delta));
|
||||||
|
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delta = (device_aspect / desired_aspect - 1.0f)
|
||||||
|
/ 2.0f + 0.5f;
|
||||||
|
y = (int)roundf(viewport_height * (0.5f - delta));
|
||||||
|
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rsx->vp.x = x;
|
||||||
|
rsx->vp.y = y;
|
||||||
|
rsx->vp.width = viewport_width;
|
||||||
|
rsx->vp.height = viewport_height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rsx->vp.x = 0;
|
||||||
|
rsx->vp.y = 0;
|
||||||
|
rsx->vp.width = viewport_width;
|
||||||
|
rsx->vp.height = viewport_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
vp.min = 0.0f;
|
||||||
|
vp.max = 1.0f;
|
||||||
|
vp.x = rsx->vp.x;
|
||||||
|
vp.y = rsx->height - rsx->vp.y - rsx->vp.height;
|
||||||
|
vp.w = rsx->vp.width;
|
||||||
|
vp.h = rsx->vp.height;
|
||||||
|
vp.scale[0] = vp.w * 0.5f;
|
||||||
|
vp.scale[1] = vp.h * -0.5f;
|
||||||
|
vp.scale[2] = (vp.max - vp.min) * 0.5f;
|
||||||
|
vp.scale[3] = 0.0f;
|
||||||
|
vp.offset[0] = vp.x + vp.w * 0.5f;
|
||||||
|
vp.offset[1] = vp.y + vp.h * 0.5f;
|
||||||
|
vp.offset[2] = (vp.max + vp.min) * 0.5f;
|
||||||
|
vp.offset[3] = 0.0f;
|
||||||
|
|
||||||
|
rsxSetViewport(rsx->context, vp.x, vp.y, vp.w, vp.h, vp.min, vp.max, vp.scale, vp.offset);
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
rsxSetViewportClip(rsx->context, i, rsx->width, rsx->height);
|
||||||
|
rsxSetScissor(rsx->context, vp.x, vp.y, vp.w, vp.h);
|
||||||
|
|
||||||
|
rsx_set_projection(rsx, &ortho, allow_rotate);
|
||||||
|
|
||||||
|
/* Set last backbuffer viewport. */
|
||||||
|
if (!force_full)
|
||||||
|
{
|
||||||
|
rsx->vp.width = viewport_width;
|
||||||
|
rsx->vp.height = viewport_height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static const gfx_ctx_driver_t* rsx_get_context(rsx_t* rsx)
|
static const gfx_ctx_driver_t* rsx_get_context(rsx_t* rsx)
|
||||||
{
|
{
|
||||||
@ -117,11 +275,11 @@ static int rsx_make_buffer(rsxBuffer * buffer, u16 width, u16 height, int id)
|
|||||||
if (!(buffer->ptr = (uint32_t*)rsxMemalign (64, size)))
|
if (!(buffer->ptr = (uint32_t*)rsxMemalign (64, size)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (rsxAddressToOffset (buffer->ptr, &buffer->offset) != 0)
|
if (rsxAddressToOffset(buffer->ptr, &buffer->offset) != 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Register the display buffer with the RSX */
|
/* Register the display buffer with the RSX */
|
||||||
if (gcmSetDisplayBuffer (id, buffer->offset, pitch, width, height) != 0)
|
if (gcmSetDisplayBuffer(id, buffer->offset, pitch, width, height) != 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
buffer->width = width;
|
buffer->width = width;
|
||||||
@ -152,11 +310,11 @@ static int rsx_flip(gcmContextData *context, s32 buffer)
|
|||||||
|
|
||||||
static void rsx_wait_finish(gcmContextData *context, u32 sLabelVal)
|
static void rsx_wait_finish(gcmContextData *context, u32 sLabelVal)
|
||||||
{
|
{
|
||||||
rsxSetWriteBackendLabel (context, GCM_LABEL_INDEX, sLabelVal);
|
rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal);
|
||||||
|
|
||||||
rsxFlushBuffer (context);
|
rsxFlushBuffer(context);
|
||||||
|
|
||||||
while(*(vu32 *) gcmGetLabelAddress (GCM_LABEL_INDEX) != sLabelVal)
|
while(*(vu32 *)gcmGetLabelAddress(GCM_LABEL_INDEX) != sLabelVal)
|
||||||
usleep(30);
|
usleep(30);
|
||||||
|
|
||||||
sLabelVal++;
|
sLabelVal++;
|
||||||
@ -166,8 +324,8 @@ static void rsx_wait_rsx_idle(gcmContextData *context)
|
|||||||
{
|
{
|
||||||
u32 sLabelVal = 1;
|
u32 sLabelVal = 1;
|
||||||
|
|
||||||
rsxSetWriteBackendLabel (context, GCM_LABEL_INDEX, sLabelVal);
|
rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal);
|
||||||
rsxSetWaitLabel (context, GCM_LABEL_INDEX, sLabelVal);
|
rsxSetWaitLabel(context, GCM_LABEL_INDEX, sLabelVal);
|
||||||
|
|
||||||
sLabelVal++;
|
sLabelVal++;
|
||||||
|
|
||||||
@ -177,7 +335,7 @@ static void rsx_wait_rsx_idle(gcmContextData *context)
|
|||||||
static void rsx_wait_flip(void)
|
static void rsx_wait_flip(void)
|
||||||
{
|
{
|
||||||
while(gcmGetFlipStatus() != 0)
|
while(gcmGetFlipStatus() != 0)
|
||||||
usleep (200); /* Sleep, to not stress the cpu. */
|
usleep(200); /* Sleep, to not stress the cpu. */
|
||||||
gcmResetFlipStatus();
|
gcmResetFlipStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +352,7 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
|||||||
{
|
{
|
||||||
/* Allocate a 1Mb buffer, alligned to a 1Mb boundary
|
/* Allocate a 1Mb buffer, alligned to a 1Mb boundary
|
||||||
* to be our shared IO memory with the RSX. */
|
* to be our shared IO memory with the RSX. */
|
||||||
void *host_addr = memalign (1024*1024, HOST_SIZE);
|
void *host_addr = memalign(1024*1024, HOST_SIZE);
|
||||||
|
|
||||||
if (!host_addr)
|
if (!host_addr)
|
||||||
goto error;
|
goto error;
|
||||||
@ -204,9 +362,9 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
|||||||
#ifdef NV40TCL_RENDER_ENABLE
|
#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 */
|
* workaround this by using one of the new defines */
|
||||||
rsxInit (&context, CB_SIZE, HOST_SIZE, host_addr);
|
rsxInit(&context, CB_SIZE, HOST_SIZE, host_addr);
|
||||||
#else
|
#else
|
||||||
context = rsxInit (CB_SIZE, HOST_SIZE, host_addr);
|
context = rsxInit(CB_SIZE, HOST_SIZE, host_addr);
|
||||||
#endif
|
#endif
|
||||||
if (!context)
|
if (!context)
|
||||||
goto error;
|
goto error;
|
||||||
@ -216,7 +374,7 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
|||||||
context = saved_context;
|
context = saved_context;
|
||||||
|
|
||||||
/* Get the state of the display */
|
/* Get the state of the display */
|
||||||
if (videoGetState (0, 0, &state) != 0)
|
if (videoGetState(0, 0, &state) != 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Make sure display is enabled */
|
/* Make sure display is enabled */
|
||||||
@ -224,7 +382,7 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Get the current resolution */
|
/* Get the current resolution */
|
||||||
if (videoGetResolution (state.displayMode.resolution, &res) != 0)
|
if (videoGetResolution(state.displayMode.resolution, &res) != 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Configure the buffer format to xRGB */
|
/* Configure the buffer format to xRGB */
|
||||||
@ -239,18 +397,18 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
|||||||
|
|
||||||
rsx_wait_rsx_idle(context);
|
rsx_wait_rsx_idle(context);
|
||||||
|
|
||||||
if (videoConfigure (0, &vconfig, NULL, 0) != 0)
|
if (videoConfigure(0, &vconfig, NULL, 0) != 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (videoGetState (0, 0, &state) != 0)
|
if (videoGetState(0, 0, &state) != 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
gcmSetFlipMode (GCM_FLIP_VSYNC); /* Wait for VSYNC to flip */
|
gcmSetFlipMode(GCM_FLIP_VSYNC); /* Wait for VSYNC to flip */
|
||||||
|
|
||||||
gcm->depth_pitch = res.width * sizeof(u32);
|
gcm->depth_pitch = res.width * sizeof(u32);
|
||||||
gcm->depth_buffer = (u32 *) rsxMemalign (64, (res.height * gcm->depth_pitch)); //Beware, if was (res.height * gcm->depth_pitch)*2
|
gcm->depth_buffer = (u32 *)rsxMemalign(64, (res.height * gcm->depth_pitch)); /* Beware, if was (res.height * gcm->depth_pitch) * 2 */
|
||||||
|
|
||||||
rsxAddressToOffset (gcm->depth_buffer, &gcm->depth_offset);
|
rsxAddressToOffset(gcm->depth_buffer, &gcm->depth_offset);
|
||||||
|
|
||||||
gcmResetFlipStatus();
|
gcmResetFlipStatus();
|
||||||
|
|
||||||
@ -259,10 +417,10 @@ static gcmContextData *rsx_init_screen(rsx_t* gcm)
|
|||||||
error:
|
error:
|
||||||
#if 0
|
#if 0
|
||||||
if (context)
|
if (context)
|
||||||
rsxFinish (context, 0);
|
rsxFinish(context, 0);
|
||||||
|
|
||||||
if (gcm->host_addr)
|
if (gcm->host_addr)
|
||||||
free (gcm->host_addr);
|
free(gcm->host_addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -578,112 +736,6 @@ static void rsx_update_viewport(rsx_t* rsx)
|
|||||||
rsx->should_resize = false;
|
rsx->should_resize = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rsx_set_viewport(void *data, unsigned viewport_width,
|
|
||||||
unsigned viewport_height, bool force_full, bool allow_rotate)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
rsx_viewport_t vp;
|
|
||||||
int x = 0;
|
|
||||||
int y = 0;
|
|
||||||
float device_aspect = (float)viewport_width / viewport_height;
|
|
||||||
struct video_ortho ortho = {0, 1, 0, 1, -1, 1};
|
|
||||||
settings_t *settings = config_get_ptr();
|
|
||||||
rsx_t *rsx = (rsx_t*)data;
|
|
||||||
bool video_scale_integer = settings->bools.video_scale_integer;
|
|
||||||
unsigned aspect_ratio_idx = settings->uints.video_aspect_ratio_idx;
|
|
||||||
|
|
||||||
if (video_scale_integer && !force_full)
|
|
||||||
{
|
|
||||||
video_viewport_get_scaled_integer(&rsx->vp,
|
|
||||||
viewport_width, viewport_height,
|
|
||||||
video_driver_get_aspect_ratio(), rsx->keep_aspect);
|
|
||||||
viewport_width = rsx->vp.width;
|
|
||||||
viewport_height = rsx->vp.height;
|
|
||||||
}
|
|
||||||
else if (rsx->keep_aspect && !force_full)
|
|
||||||
{
|
|
||||||
float desired_aspect = video_driver_get_aspect_ratio();
|
|
||||||
|
|
||||||
#if defined(HAVE_MENU)
|
|
||||||
if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
|
|
||||||
{
|
|
||||||
const struct video_viewport *custom = video_viewport_get_custom();
|
|
||||||
|
|
||||||
x = custom->x;
|
|
||||||
y = custom->y;
|
|
||||||
viewport_width = custom->width;
|
|
||||||
viewport_height = custom->height;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
float delta;
|
|
||||||
if (fabsf(device_aspect - desired_aspect) < 0.0001f)
|
|
||||||
{
|
|
||||||
/* If the aspect ratios of screen and desired aspect
|
|
||||||
* ratio are sufficiently equal (floating point stuff),
|
|
||||||
* assume they are actually equal.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
else if (device_aspect > desired_aspect)
|
|
||||||
{
|
|
||||||
delta = (desired_aspect / device_aspect - 1.0f)
|
|
||||||
/ 2.0f + 0.5f;
|
|
||||||
x = (int)roundf(viewport_width * (0.5f - delta));
|
|
||||||
viewport_width = (unsigned)roundf(2.0f * viewport_width * delta);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delta = (device_aspect / desired_aspect - 1.0f)
|
|
||||||
/ 2.0f + 0.5f;
|
|
||||||
y = (int)roundf(viewport_height * (0.5f - delta));
|
|
||||||
viewport_height = (unsigned)roundf(2.0f * viewport_height * delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rsx->vp.x = x;
|
|
||||||
rsx->vp.y = y;
|
|
||||||
rsx->vp.width = viewport_width;
|
|
||||||
rsx->vp.height = viewport_height;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rsx->vp.x = 0;
|
|
||||||
rsx->vp.y = 0;
|
|
||||||
rsx->vp.width = viewport_width;
|
|
||||||
rsx->vp.height = viewport_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
vp.min = 0.0f;
|
|
||||||
vp.max = 1.0f;
|
|
||||||
vp.x = rsx->vp.x;
|
|
||||||
vp.y = rsx->height - rsx->vp.y - rsx->vp.height;
|
|
||||||
vp.w = rsx->vp.width;
|
|
||||||
vp.h = rsx->vp.height;
|
|
||||||
vp.scale[0] = vp.w * 0.5f;
|
|
||||||
vp.scale[1] = vp.h * -0.5f;
|
|
||||||
vp.scale[2] = (vp.max - vp.min) * 0.5f;
|
|
||||||
vp.scale[3] = 0.0f;
|
|
||||||
vp.offset[0] = vp.x + vp.w * 0.5f;
|
|
||||||
vp.offset[1] = vp.y + vp.h * 0.5f;
|
|
||||||
vp.offset[2] = (vp.max + vp.min) * 0.5f;
|
|
||||||
vp.offset[3] = 0.0f;
|
|
||||||
|
|
||||||
rsxSetViewport(rsx->context, vp.x, vp.y, vp.w, vp.h, vp.min, vp.max, vp.scale, vp.offset);
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
rsxSetViewportClip(rsx->context, i, rsx->width, rsx->height);
|
|
||||||
rsxSetScissor(rsx->context, vp.x, vp.y, vp.w, vp.h);
|
|
||||||
|
|
||||||
rsx_set_projection(rsx, &ortho, allow_rotate);
|
|
||||||
|
|
||||||
/* Set last backbuffer viewport. */
|
|
||||||
if (!force_full)
|
|
||||||
{
|
|
||||||
rsx->vp.width = viewport_width;
|
|
||||||
rsx->vp.height = viewport_height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned rsx_wrap_type_to_enum(enum gfx_wrap_type type)
|
static unsigned rsx_wrap_type_to_enum(enum gfx_wrap_type type)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
@ -864,63 +916,6 @@ static void rsx_blit_buffer(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void rsx_load_texture_data(rsx_t* rsx, rsx_texture_t *texture,
|
|
||||||
const void *frame, unsigned width, unsigned height, unsigned pitch,
|
|
||||||
bool rgb32, bool menu, enum texture_filter_type filter_type)
|
|
||||||
{
|
|
||||||
u8 *texbuffer;
|
|
||||||
u32 mag_filter, min_filter;
|
|
||||||
const u8 *data = (u8*)frame;
|
|
||||||
|
|
||||||
if (!texture->data)
|
|
||||||
{
|
|
||||||
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.mipmap = 1;
|
|
||||||
texture->tex.dimension = GCM_TEXTURE_DIMS_2D;
|
|
||||||
texture->tex.cubemap = GCM_FALSE;
|
|
||||||
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_G << GCM_TEXTURE_REMAP_COLOR_G_SHIFT)
|
|
||||||
| (GCM_TEXTURE_REMAP_COLOR_R << GCM_TEXTURE_REMAP_COLOR_R_SHIFT)
|
|
||||||
| (GCM_TEXTURE_REMAP_COLOR_A << GCM_TEXTURE_REMAP_COLOR_A_SHIFT));
|
|
||||||
texture->tex.width = width;
|
|
||||||
texture->tex.height = height;
|
|
||||||
texture->tex.depth = 1;
|
|
||||||
texture->tex.location = GCM_LOCATION_RSX;
|
|
||||||
texture->tex.pitch = pitch;
|
|
||||||
texture->tex.offset = texture->offset;
|
|
||||||
|
|
||||||
switch (filter_type)
|
|
||||||
{
|
|
||||||
case TEXTURE_FILTER_MIPMAP_NEAREST:
|
|
||||||
case TEXTURE_FILTER_NEAREST:
|
|
||||||
min_filter = GCM_TEXTURE_NEAREST;
|
|
||||||
mag_filter = GCM_TEXTURE_NEAREST;
|
|
||||||
break;
|
|
||||||
case TEXTURE_FILTER_MIPMAP_LINEAR:
|
|
||||||
case TEXTURE_FILTER_LINEAR:
|
|
||||||
default:
|
|
||||||
min_filter = GCM_TEXTURE_LINEAR;
|
|
||||||
mag_filter = GCM_TEXTURE_LINEAR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
texture->min_filter = min_filter;
|
|
||||||
texture->mag_filter = mag_filter;
|
|
||||||
texture->wrap_s = GCM_TEXTURE_CLAMP_TO_EDGE;
|
|
||||||
texture->wrap_t = GCM_TEXTURE_CLAMP_TO_EDGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rsx_set_texture(rsx_t* rsx, rsx_texture_t *texture)
|
static void rsx_set_texture(rsx_t* rsx, rsx_texture_t *texture)
|
||||||
{
|
{
|
||||||
rsxInvalidateTextureCache(rsx->context, GCM_INVALIDATE_TEXTURE);
|
rsxInvalidateTextureCache(rsx->context, GCM_INVALIDATE_TEXTURE);
|
||||||
|
@ -61,93 +61,110 @@ static void gfx_display_rsx_draw(gfx_display_ctx_draw_t *draw,
|
|||||||
void *data, unsigned video_width, unsigned video_height)
|
void *data, unsigned video_width, unsigned video_height)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
rsx_texture_t *texture = NULL;
|
|
||||||
const float *vertex = NULL;
|
|
||||||
const float *tex_coord = NULL;
|
|
||||||
const float *color = NULL;
|
|
||||||
rsx_t *rsx = (rsx_t*)data;
|
|
||||||
rsx_viewport_t vp;
|
rsx_viewport_t vp;
|
||||||
int end_vert_idx;
|
int end_vert_idx;
|
||||||
rsx_vertex_t *vertices;
|
rsx_vertex_t *vertices = NULL;
|
||||||
|
rsx_texture_t *texture = NULL;
|
||||||
|
const float *vertex = NULL;
|
||||||
|
const float *tex_coord = NULL;
|
||||||
|
const float *color = NULL;
|
||||||
|
rsx_t *rsx = (rsx_t*)data;
|
||||||
|
|
||||||
if (!rsx || !draw)
|
if (!rsx || !draw)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
texture = (rsx_texture_t *)draw->texture;
|
texture = (rsx_texture_t *)draw->texture;
|
||||||
vertex = draw->coords->vertex;
|
vertex = draw->coords->vertex;
|
||||||
tex_coord = draw->coords->tex_coord;
|
tex_coord = draw->coords->tex_coord;
|
||||||
color = draw->coords->color;
|
color = draw->coords->color;
|
||||||
|
|
||||||
if (!vertex)
|
if (!vertex)
|
||||||
vertex = &rsx_vertexes[0];
|
vertex = &rsx_vertexes[0];
|
||||||
if (!tex_coord)
|
if (!tex_coord)
|
||||||
tex_coord = &rsx_tex_coords[0];
|
tex_coord = &rsx_tex_coords[0];
|
||||||
if (!draw->coords->lut_tex_coord)
|
if (!draw->coords->lut_tex_coord)
|
||||||
draw->coords->lut_tex_coord = &rsx_tex_coords[0];
|
draw->coords->lut_tex_coord = &rsx_tex_coords[0];
|
||||||
if (!draw->texture)
|
if (!draw->texture)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vp.x = fabs(draw->x);
|
vp.x = fabs(draw->x);
|
||||||
vp.y = fabs(rsx->height - draw->y - draw->height);
|
vp.y = fabs(rsx->height - draw->y - draw->height);
|
||||||
vp.w = MIN(draw->width, rsx->width);
|
vp.w = MIN(draw->width, rsx->width);
|
||||||
vp.h = MIN(draw->height, rsx->height);
|
vp.h = MIN(draw->height, rsx->height);
|
||||||
vp.min = 0.0f;
|
vp.min = 0.0f;
|
||||||
vp.max = 1.0f;
|
vp.max = 1.0f;
|
||||||
vp.scale[0] = vp.w*0.5f;
|
vp.scale[0] = vp.w * 0.5f;
|
||||||
vp.scale[1] = vp.h*-0.5f;
|
vp.scale[1] = vp.h * -0.5f;
|
||||||
vp.scale[2] = (vp.max - vp.min)*0.5f;
|
vp.scale[2] = (vp.max - vp.min) * 0.5f;
|
||||||
vp.scale[3] = 0.0f;
|
vp.scale[3] = 0.0f;
|
||||||
vp.offset[0] = vp.x + vp.w*0.5f;
|
vp.offset[0] = vp.x + vp.w * 0.5f;
|
||||||
vp.offset[1] = vp.y + vp.h*0.5f;
|
vp.offset[1] = vp.y + vp.h * 0.5f;
|
||||||
vp.offset[2] = (vp.max + vp.min)*0.5f;
|
vp.offset[2] = (vp.max + vp.min) * 0.5f;
|
||||||
vp.offset[3] = 0.0f;
|
vp.offset[3] = 0.0f;
|
||||||
|
|
||||||
rsxSetViewport(rsx->context, vp.x, vp.y, vp.w, vp.h, vp.min, vp.max, vp.scale, vp.offset);
|
rsxSetViewport(rsx->context, vp.x, vp.y, vp.w, vp.h, vp.min, vp.max, vp.scale, vp.offset);
|
||||||
|
|
||||||
rsxInvalidateTextureCache(rsx->context, GCM_INVALIDATE_TEXTURE);
|
rsxInvalidateTextureCache(rsx->context, GCM_INVALIDATE_TEXTURE);
|
||||||
rsxLoadTexture(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index, &texture->tex);
|
rsxLoadTexture(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index, &texture->tex);
|
||||||
rsxTextureControl(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index, GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
rsxTextureControl(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index,
|
||||||
rsxTextureFilter(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index, 0, texture->min_filter, texture->mag_filter, GCM_TEXTURE_CONVOLUTION_QUINCUNX);
|
GCM_TRUE, 0 << 8, 12 << 8, GCM_TEXTURE_MAX_ANISO_1);
|
||||||
rsxTextureWrapMode(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index, texture->wrap_s, texture->wrap_t, GCM_TEXTURE_CLAMP_TO_EDGE, 0, GCM_TEXTURE_ZFUNC_LESS, 0);
|
rsxTextureFilter(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index, 0,
|
||||||
|
texture->min_filter, texture->mag_filter, GCM_TEXTURE_CONVOLUTION_QUINCUNX);
|
||||||
|
rsxTextureWrapMode(rsx->context, rsx->tex_unit[VIDEO_SHADER_STOCK_BLEND]->index, texture->wrap_s,
|
||||||
|
texture->wrap_t, GCM_TEXTURE_CLAMP_TO_EDGE, 0, GCM_TEXTURE_ZFUNC_LESS, 0);
|
||||||
|
|
||||||
#if RSX_MAX_TEXTURE_VERTICES > 0
|
#if RSX_MAX_TEXTURE_VERTICES > 0
|
||||||
/* Using preallocated texture vertices uses better memory managment but may cause more flickering */
|
/* Using preallocated texture vertices uses better memory managment but may cause more flickering */
|
||||||
end_vert_idx = rsx->texture_vert_idx + draw->coords->vertices;
|
end_vert_idx = rsx->texture_vert_idx + draw->coords->vertices;
|
||||||
if (end_vert_idx > RSX_MAX_TEXTURE_VERTICES)
|
if (end_vert_idx > RSX_MAX_TEXTURE_VERTICES)
|
||||||
{
|
{
|
||||||
rsx->texture_vert_idx = 0;
|
rsx->texture_vert_idx = 0;
|
||||||
end_vert_idx = rsx->texture_vert_idx + draw->coords->vertices;
|
end_vert_idx = rsx->texture_vert_idx + draw->coords->vertices;
|
||||||
}
|
}
|
||||||
vertices = &rsx->texture_vertices[rsx->texture_vert_idx];
|
vertices = &rsx->texture_vertices[rsx->texture_vert_idx];
|
||||||
#else
|
#else
|
||||||
/* Smoother gfx at the cost of unmanaged rsx memory */
|
/* Smoother gfx at the cost of unmanaged rsx memory */
|
||||||
rsx->texture_vert_idx = 0;
|
rsx->texture_vert_idx = 0;
|
||||||
end_vert_idx = draw->coords->vertices;
|
end_vert_idx = draw->coords->vertices;
|
||||||
vertices = (rsx_vertex_t *)rsxMemalign(128, sizeof(rsx_vertex_t) * draw->coords->vertices);
|
vertices = (rsx_vertex_t *)rsxMemalign(128, sizeof(rsx_vertex_t) * draw->coords->vertices);
|
||||||
#endif
|
#endif
|
||||||
for (i = rsx->texture_vert_idx; i < end_vert_idx; i++)
|
for (i = rsx->texture_vert_idx; i < end_vert_idx; i++)
|
||||||
{
|
{
|
||||||
vertices[i].x = *vertex++;
|
vertices[i].x = *vertex++;
|
||||||
vertices[i].y = *vertex++;
|
vertices[i].y = *vertex++;
|
||||||
vertices[i].u = *tex_coord++;
|
vertices[i].u = *tex_coord++;
|
||||||
vertices[i].v = *tex_coord++;
|
vertices[i].v = *tex_coord++;
|
||||||
vertices[i].r = *color++;
|
vertices[i].r = *color++;
|
||||||
vertices[i].g = *color++;
|
vertices[i].g = *color++;
|
||||||
vertices[i].b = *color++;
|
vertices[i].b = *color++;
|
||||||
vertices[i].a = *color++;
|
vertices[i].a = *color++;
|
||||||
}
|
}
|
||||||
rsxAddressToOffset(&vertices[rsx->texture_vert_idx].x, &rsx->pos_offset[VIDEO_SHADER_STOCK_BLEND]);
|
rsxAddressToOffset(&vertices[rsx->texture_vert_idx].x,
|
||||||
rsxAddressToOffset(&vertices[rsx->texture_vert_idx].u, &rsx->uv_offset[VIDEO_SHADER_STOCK_BLEND]);
|
&rsx->pos_offset[VIDEO_SHADER_STOCK_BLEND]);
|
||||||
rsxAddressToOffset(&vertices[rsx->texture_vert_idx].r, &rsx->col_offset[VIDEO_SHADER_STOCK_BLEND]);
|
rsxAddressToOffset(&vertices[rsx->texture_vert_idx].u,
|
||||||
rsx->texture_vert_idx = end_vert_idx;
|
&rsx->uv_offset[VIDEO_SHADER_STOCK_BLEND]);
|
||||||
|
rsxAddressToOffset(&vertices[rsx->texture_vert_idx].r,
|
||||||
|
&rsx->col_offset[VIDEO_SHADER_STOCK_BLEND]);
|
||||||
|
rsx->texture_vert_idx = end_vert_idx;
|
||||||
|
|
||||||
rsxBindVertexArrayAttrib(rsx->context, rsx->pos_index[VIDEO_SHADER_STOCK_BLEND]->index, 0, rsx->pos_offset[VIDEO_SHADER_STOCK_BLEND], sizeof(rsx_vertex_t), 2, GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
rsxBindVertexArrayAttrib(rsx->context, rsx->pos_index[VIDEO_SHADER_STOCK_BLEND]->index, 0,
|
||||||
rsxBindVertexArrayAttrib(rsx->context, rsx->uv_index[VIDEO_SHADER_STOCK_BLEND]->index, 0, rsx->uv_offset[VIDEO_SHADER_STOCK_BLEND], sizeof(rsx_vertex_t), 2, GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
rsx->pos_offset[VIDEO_SHADER_STOCK_BLEND], sizeof(rsx_vertex_t), 2,
|
||||||
rsxBindVertexArrayAttrib(rsx->context, rsx->col_index[VIDEO_SHADER_STOCK_BLEND]->index, 0, rsx->col_offset[VIDEO_SHADER_STOCK_BLEND], sizeof(rsx_vertex_t), 4, GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||||
|
rsxBindVertexArrayAttrib(rsx->context, rsx->uv_index[VIDEO_SHADER_STOCK_BLEND]->index, 0,
|
||||||
|
rsx->uv_offset[VIDEO_SHADER_STOCK_BLEND], sizeof(rsx_vertex_t), 2,
|
||||||
|
GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||||
|
rsxBindVertexArrayAttrib(rsx->context, rsx->col_index[VIDEO_SHADER_STOCK_BLEND]->index, 0,
|
||||||
|
rsx->col_offset[VIDEO_SHADER_STOCK_BLEND], sizeof(rsx_vertex_t), 4,
|
||||||
|
GCM_VERTEX_DATA_TYPE_F32, GCM_LOCATION_RSX);
|
||||||
|
|
||||||
rsxLoadVertexProgram(rsx->context, rsx->vpo[VIDEO_SHADER_STOCK_BLEND], rsx->vp_ucode[VIDEO_SHADER_STOCK_BLEND]);
|
rsxLoadVertexProgram(rsx->context, rsx->vpo[VIDEO_SHADER_STOCK_BLEND],
|
||||||
rsxSetVertexProgramParameter(rsx->context, rsx->vpo[VIDEO_SHADER_STOCK_BLEND], rsx->proj_matrix[VIDEO_SHADER_STOCK_BLEND], (float *)&rsx->mvp_no_rot);
|
rsx->vp_ucode[VIDEO_SHADER_STOCK_BLEND]);
|
||||||
rsxLoadFragmentProgramLocation(rsx->context, rsx->fpo[VIDEO_SHADER_STOCK_BLEND], rsx->fp_offset[VIDEO_SHADER_STOCK_BLEND], GCM_LOCATION_RSX);
|
rsxSetVertexProgramParameter(rsx->context,
|
||||||
|
rsx->vpo[VIDEO_SHADER_STOCK_BLEND], rsx->proj_matrix[VIDEO_SHADER_STOCK_BLEND],
|
||||||
|
(float *)&rsx->mvp_no_rot);
|
||||||
|
rsxLoadFragmentProgramLocation(rsx->context,
|
||||||
|
rsx->fpo[VIDEO_SHADER_STOCK_BLEND], rsx->fp_offset[VIDEO_SHADER_STOCK_BLEND],
|
||||||
|
GCM_LOCATION_RSX);
|
||||||
|
|
||||||
rsxClearSurface(rsx->context, GCM_CLEAR_Z);
|
rsxClearSurface(rsx->context, GCM_CLEAR_Z);
|
||||||
rsxDrawVertexArray(rsx->context, GCM_TYPE_TRIANGLE_STRIP, 0, draw->coords->vertices);
|
rsxDrawVertexArray(rsx->context, GCM_TYPE_TRIANGLE_STRIP, 0, draw->coords->vertices);
|
||||||
@ -175,14 +192,14 @@ static void gfx_display_rsx_scissor_end(
|
|||||||
static void gfx_display_rsx_blend_begin(void *data)
|
static void gfx_display_rsx_blend_begin(void *data)
|
||||||
{
|
{
|
||||||
rsx_t *rsx = (rsx_t *)data;
|
rsx_t *rsx = (rsx_t *)data;
|
||||||
rsxSetBlendEnable(rsx->context, GCM_TRUE);
|
rsxSetBlendEnable(rsx->context, GCM_TRUE);
|
||||||
rsxSetBlendFunc(rsx->context, GCM_SRC_ALPHA, GCM_ONE_MINUS_SRC_ALPHA, GCM_SRC_ALPHA, GCM_ONE_MINUS_SRC_ALPHA);
|
rsxSetBlendFunc(rsx->context, GCM_SRC_ALPHA, GCM_ONE_MINUS_SRC_ALPHA, GCM_SRC_ALPHA, GCM_ONE_MINUS_SRC_ALPHA);
|
||||||
rsxSetBlendEquation(rsx->context, GCM_FUNC_ADD, GCM_FUNC_ADD);
|
rsxSetBlendEquation(rsx->context, GCM_FUNC_ADD, GCM_FUNC_ADD);
|
||||||
#if 0
|
#if 0
|
||||||
rsxSetBlendEnableMrt(rsx->context, GCM_TRUE, GCM_TRUE, GCM_TRUE);
|
rsxSetBlendEnableMrt(rsx->context, GCM_TRUE, GCM_TRUE, GCM_TRUE);
|
||||||
rsxSetDepthFunc(rsx->context, GCM_LESS);
|
rsxSetDepthFunc(rsx->context, GCM_LESS);
|
||||||
rsxSetDepthTestEnable(rsx->context, GCM_FALSE);
|
rsxSetDepthTestEnable(rsx->context, GCM_FALSE);
|
||||||
rsxSetAlphaFunc(rsx->context, GCM_ALWAYS, 0);
|
rsxSetAlphaFunc(rsx->context, GCM_ALWAYS, 0);
|
||||||
rsxSetAlphaTestEnable(rsx->context, GCM_TRUE);
|
rsxSetAlphaTestEnable(rsx->context, GCM_TRUE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user