Skip to content

Commit 6365a75

Browse files
committed
Merge branch 'master' into libretro
2 parents febf224 + 7192adb commit 6365a75

File tree

22 files changed

+1102
-443
lines changed

22 files changed

+1102
-443
lines changed

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,11 @@ endif
363363

364364
ifeq "$(PLATFORM)" "generic"
365365
OBJS += frontend/libpicofe/in_sdl.o
366-
OBJS += frontend/libpicofe/plat_sdl.o
366+
#OBJS += frontend/libpicofe/plat_sdl.o
367367
OBJS += frontend/libpicofe/plat_dummy.o
368368
OBJS += frontend/plat_sdl.o
369+
frontend/plat_sdl.o frontend/libpicofe/plat_sdl.o: CFLAGS += -DSDL_OVERLAY_2X
370+
frontend/menu.o: CFLAGS += -DSDL_OVERLAY_2X -DMENU_SHOW_VARSCALER=1
369371
ifeq "$(HAVE_EVDEV)" "1"
370372
OBJS += frontend/libpicofe/linux/in_evdev.o
371373
endif
@@ -386,6 +388,7 @@ OBJS += frontend/libpicofe/linux/fbdev.o frontend/libpicofe/linux/xenv.o
386388
OBJS += frontend/libpicofe/linux/in_evdev.o
387389
OBJS += frontend/plat_pandora.o frontend/plat_omap.o
388390
frontend/main.o frontend/menu.o: CFLAGS += -include frontend/pandora/ui_feat.h
391+
frontend/main.o frontend/plugin_lib.o: CFLAGS += -DPANDORA
389392
frontend/libpicofe/linux/plat.o: CFLAGS += -DPANDORA
390393
USE_PLUGIN_LIB = 1
391394
USE_FRONTEND = 1
@@ -463,6 +466,7 @@ endif
463466
ifeq "$(USE_FRONTEND)" "1"
464467
OBJS += frontend/menu.o
465468
OBJS += frontend/libpicofe/input.o
469+
frontend/libpicofe/input.o: CFLAGS += -Wno-array-bounds
466470
frontend/menu.o: frontend/libpicofe/menu.c
467471
ifeq "$(HAVE_TSLIB)" "1"
468472
frontend/%.o: CFLAGS += -DHAVE_TSLIB

frontend/cspace.c

Lines changed: 125 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -168,36 +168,53 @@ void bgr888_to_xrgb8888(void * __restrict__ dst_, const void * __restrict__ src_
168168
/* YUV stuff */
169169
static int yuv_ry[32], yuv_gy[32], yuv_by[32];
170170
static unsigned char yuv_u[32 * 2], yuv_v[32 * 2];
171+
static struct uyvy { uint32_t y:8; uint32_t vyu:24; } yuv_uyvy[32768];
171172

172173
void bgr_to_uyvy_init(void)
173174
{
174-
int i, v;
175-
176-
/* init yuv converter:
177-
y0 = (int)((0.299f * r0) + (0.587f * g0) + (0.114f * b0));
178-
y1 = (int)((0.299f * r1) + (0.587f * g1) + (0.114f * b1));
179-
u = (int)(8 * 0.565f * (b0 - y0)) + 128;
180-
v = (int)(8 * 0.713f * (r0 - y0)) + 128;
181-
*/
182-
for (i = 0; i < 32; i++) {
183-
yuv_ry[i] = (int)(0.299f * i * 65536.0f + 0.5f);
184-
yuv_gy[i] = (int)(0.587f * i * 65536.0f + 0.5f);
185-
yuv_by[i] = (int)(0.114f * i * 65536.0f + 0.5f);
186-
}
187-
for (i = -32; i < 32; i++) {
188-
v = (int)(8 * 0.565f * i) + 128;
189-
if (v < 0)
190-
v = 0;
191-
if (v > 255)
192-
v = 255;
193-
yuv_u[i + 32] = v;
194-
v = (int)(8 * 0.713f * i) + 128;
195-
if (v < 0)
196-
v = 0;
197-
if (v > 255)
198-
v = 255;
199-
yuv_v[i + 32] = v;
200-
}
175+
unsigned char yuv_y[256];
176+
int i, v;
177+
178+
/* init yuv converter:
179+
y0 = (int)((0.299f * r0) + (0.587f * g0) + (0.114f * b0));
180+
y1 = (int)((0.299f * r1) + (0.587f * g1) + (0.114f * b1));
181+
u = (int)(8 * 0.565f * (b0 - y0)) + 128;
182+
v = (int)(8 * 0.713f * (r0 - y0)) + 128;
183+
*/
184+
for (i = 0; i < 32; i++) {
185+
yuv_ry[i] = (int)(0.299f * i * 65536.0f + 0.5f);
186+
yuv_gy[i] = (int)(0.587f * i * 65536.0f + 0.5f);
187+
yuv_by[i] = (int)(0.114f * i * 65536.0f + 0.5f);
188+
}
189+
for (i = -32; i < 32; i++) {
190+
v = (int)(8 * 0.565f * i) + 128;
191+
if (v < 0)
192+
v = 0;
193+
if (v > 255)
194+
v = 255;
195+
yuv_u[i + 32] = v;
196+
v = (int)(8 * 0.713f * i) + 128;
197+
if (v < 0)
198+
v = 0;
199+
if (v > 255)
200+
v = 255;
201+
yuv_v[i + 32] = v;
202+
}
203+
// valid Y range seems to be 16..235
204+
for (i = 0; i < 256; i++) {
205+
yuv_y[i] = 16 + 219 * i / 32;
206+
}
207+
// everything combined into one large array for speed
208+
for (i = 0; i < 32768; i++) {
209+
int r = (i >> 0) & 0x1f, g = (i >> 5) & 0x1f, b = (i >> 10) & 0x1f;
210+
int y = (yuv_ry[r] + yuv_gy[g] + yuv_by[b]) >> 16;
211+
yuv_uyvy[i].y = yuv_y[y];
212+
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
213+
yuv_uyvy[i].vyu = (yuv_v[b-y + 32] << 16) | (yuv_y[y] << 8) | yuv_u[r-y + 32];
214+
#else
215+
yuv_uyvy[i].vyu = (yuv_v[r-y + 32] << 16) | (yuv_y[y] << 8) | yuv_u[b-y + 32];
216+
#endif
217+
}
201218
}
202219

203220
void rgb565_to_uyvy(void *d, const void *s, int pixels)
@@ -229,54 +246,89 @@ void rgb565_to_uyvy(void *d, const void *s, int pixels)
229246
}
230247
}
231248

232-
void bgr555_to_uyvy(void *d, const void *s, int pixels)
249+
void bgr555_to_uyvy(void *d, const void *s, int pixels, int x2)
233250
{
234-
unsigned int *dst = d;
235-
const unsigned short *src = s;
236-
const unsigned char *yu = yuv_u + 32;
237-
const unsigned char *yv = yuv_v + 32;
238-
int r0, g0, b0, r1, g1, b1;
239-
int y0, y1, u, v;
240-
241-
for (; pixels > 1; src += 2, dst++, pixels -= 2)
242-
{
243-
b0 = (src[0] >> 10) & 0x1f;
244-
g0 = (src[0] >> 5) & 0x1f;
245-
r0 = src[0] & 0x1f;
246-
b1 = (src[1] >> 10) & 0x1f;
247-
g1 = (src[1] >> 5) & 0x1f;
248-
r1 = src[1] & 0x1f;
249-
y0 = (yuv_ry[r0] + yuv_gy[g0] + yuv_by[b0]) >> 16;
250-
y1 = (yuv_ry[r1] + yuv_gy[g1] + yuv_by[b1]) >> 16;
251-
u = yu[b0 - y0];
252-
v = yv[r0 - y0];
253-
y0 = 16 + 219 * y0 / 31;
254-
y1 = 16 + 219 * y1 / 31;
255-
256-
*dst = (y1 << 24) | (v << 16) | (y0 << 8) | u;
257-
}
251+
uint32_t *dst = d;
252+
const uint16_t *src = s;
253+
int i;
254+
255+
if (x2) {
256+
for (i = pixels; i >= 4; src += 4, dst += 4, i -= 4)
257+
{
258+
const struct uyvy *uyvy0 = yuv_uyvy + (src[0] & 0x7fff);
259+
const struct uyvy *uyvy1 = yuv_uyvy + (src[1] & 0x7fff);
260+
const struct uyvy *uyvy2 = yuv_uyvy + (src[2] & 0x7fff);
261+
const struct uyvy *uyvy3 = yuv_uyvy + (src[3] & 0x7fff);
262+
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
263+
dst[0] = uyvy0->y | (uyvy0->vyu << 8);
264+
dst[1] = uyvy1->y | (uyvy1->vyu << 8);
265+
dst[2] = uyvy2->y | (uyvy2->vyu << 8);
266+
dst[3] = uyvy3->y | (uyvy3->vyu << 8);
267+
#else
268+
dst[0] = (uyvy0->y << 24) | uyvy0->vyu;
269+
dst[1] = (uyvy1->y << 24) | uyvy1->vyu;
270+
dst[2] = (uyvy2->y << 24) | uyvy2->vyu;
271+
dst[3] = (uyvy3->y << 24) | uyvy3->vyu;
272+
#endif
273+
}
274+
} else {
275+
for (i = pixels; i >= 4; src += 4, dst += 2, i -= 4)
276+
{
277+
const struct uyvy *uyvy0 = yuv_uyvy + (src[0] & 0x7fff);
278+
const struct uyvy *uyvy1 = yuv_uyvy + (src[1] & 0x7fff);
279+
const struct uyvy *uyvy2 = yuv_uyvy + (src[2] & 0x7fff);
280+
const struct uyvy *uyvy3 = yuv_uyvy + (src[3] & 0x7fff);
281+
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
282+
dst[0] = uyvy1->y | (uyvy0->vyu << 8);
283+
dst[1] = uyvy3->y | (uyvy2->vyu << 8);
284+
#else
285+
dst[0] = (uyvy1->y << 24) | uyvy0->vyu;
286+
dst[1] = (uyvy3->y << 24) | uyvy2->vyu;
287+
#endif
288+
}
289+
}
258290
}
259291

260-
void bgr888_to_uyvy(void *d, const void *s, int pixels)
292+
void bgr888_to_uyvy(void *d, const void *s, int pixels, int x2)
261293
{
262-
unsigned int *dst = d;
263-
const unsigned char *src8 = s;
264-
const unsigned char *yu = yuv_u + 32;
265-
const unsigned char *yv = yuv_v + 32;
266-
int r0, g0, b0, r1, g1, b1;
267-
int y0, y1, u, v;
268-
269-
for (; pixels > 0; src8 += 3*2, dst++, pixels -= 2)
270-
{
271-
r0 = src8[0], g0 = src8[1], b0 = src8[2];
272-
r1 = src8[3], g1 = src8[4], b1 = src8[5];
273-
y0 = (r0 * 19595 + g0 * 38470 + b0 * 7471) >> 16;
274-
y1 = (r1 * 19595 + g1 * 38470 + b1 * 7471) >> 16;
275-
u = yu[(b0 - y0) / 8];
276-
v = yv[(r0 - y0) / 8];
277-
y0 = 16 + 219 * y0 / 255;
278-
y1 = 16 + 219 * y1 / 255;
279-
280-
*dst = (y1 << 24) | (v << 16) | (y0 << 8) | u;
281-
}
294+
unsigned int *dst = d;
295+
const unsigned char *src8 = s;
296+
const unsigned char *yu = yuv_u + 32;
297+
const unsigned char *yv = yuv_v + 32;
298+
int r0, g0, b0, r1, g1, b1;
299+
int y0, y1, u0, u1, v0, v1;
300+
301+
if (x2) {
302+
for (; pixels >= 2; src8 += 3*2, pixels -= 2)
303+
{
304+
r0 = src8[0], g0 = src8[1], b0 = src8[2];
305+
r1 = src8[3], g1 = src8[4], b1 = src8[5];
306+
y0 = (r0 * 19595 + g0 * 38470 + b0 * 7471) >> 16;
307+
y1 = (r1 * 19595 + g1 * 38470 + b1 * 7471) >> 16;
308+
u0 = yu[(b0 - y0) / 8];
309+
u1 = yu[(b1 - y1) / 8];
310+
v0 = yv[(r0 - y0) / 8];
311+
v1 = yv[(r1 - y1) / 8];
312+
y0 = 16 + 219 * y0 / 255;
313+
y1 = 16 + 219 * y1 / 255;
314+
315+
*dst++ = (y0 << 24) | (v0 << 16) | (y0 << 8) | u0;
316+
*dst++ = (y1 << 24) | (v1 << 16) | (y1 << 8) | u1;
317+
}
318+
}
319+
else {
320+
for (; pixels >= 2; src8 += 3*2, dst++, pixels -= 2)
321+
{
322+
r0 = src8[0], g0 = src8[1], b0 = src8[2];
323+
r1 = src8[3], g1 = src8[4], b1 = src8[5];
324+
y0 = (r0 * 19595 + g0 * 38470 + b0 * 7471) >> 16;
325+
y1 = (r1 * 19595 + g1 * 38470 + b1 * 7471) >> 16;
326+
u0 = yu[(b0 - y0) / 8];
327+
v0 = yv[(r0 - y0) / 8];
328+
y0 = 16 + 219 * y0 / 255;
329+
y1 = 16 + 219 * y1 / 255;
330+
331+
*dst = (y1 << 24) | (v0 << 16) | (y0 << 8) | u0;
332+
}
333+
}
282334
}

frontend/cspace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ void bgr888_to_xrgb8888(void *dst, const void *src, int bytes);
1919

2020
void bgr_to_uyvy_init(void);
2121
void rgb565_to_uyvy(void *d, const void *s, int pixels);
22-
void bgr555_to_uyvy(void *d, const void *s, int pixels);
23-
void bgr888_to_uyvy(void *d, const void *s, int pixels);
22+
void bgr555_to_uyvy(void *d, const void *s, int pixels, int x2);
23+
void bgr888_to_uyvy(void *d, const void *s, int pixels, int x2);
2424

2525
#ifdef __cplusplus
2626
}

frontend/libretro-cdrom.c

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
//#include <linux/cdrom.h>
55
#endif
66

7+
#include "../libpcsxcore/psxcommon.h"
8+
#include "../libpcsxcore/cdrom.h"
9+
10+
//#include "vfs/vfs_implementation.h"
11+
#include "vfs/vfs_implementation_cdrom.h"
12+
713
static int cdrom_send_command_dummy(const libretro_vfs_implementation_file *stream,
814
CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len,
915
unsigned char *sense, size_t sense_len)
@@ -55,8 +61,7 @@ int cdrom_set_read_speed_x(libretro_vfs_implementation_file *stream, unsigned sp
5561
return ret;
5662
}
5763

58-
int cdrom_read_sector(libretro_vfs_implementation_file *stream,
59-
unsigned int lba, void *b)
64+
int rcdrom_readSector(void *stream, unsigned int lba, void *b)
6065
{
6166
unsigned char cmd[] = {0xBE, 0, 0, 0, 0, 0, 0, 0, 1, 0xF8, 0, 0};
6267
cmd[2] = lba >> 24;
@@ -66,4 +71,77 @@ int cdrom_read_sector(libretro_vfs_implementation_file *stream,
6671
return cdrom_send_command_once(stream, DIRECTION_IN, b, 2352, cmd, sizeof(cmd));
6772
}
6873

74+
void *rcdrom_open(const char *name, u32 *total_lba, u32 *have_subchannel)
75+
{
76+
void *g_cd_handle = retro_vfs_file_open_impl(name, RETRO_VFS_FILE_ACCESS_READ,
77+
RETRO_VFS_FILE_ACCESS_HINT_NONE);
78+
if (!g_cd_handle) {
79+
SysPrintf("retro_vfs_file_open failed for '%s'\n", name);
80+
return NULL;
81+
}
82+
else {
83+
int ret = cdrom_set_read_speed_x(g_cd_handle, 4);
84+
if (ret) SysPrintf("CD speed set failed\n");
85+
const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
86+
const cdrom_track_t *last = &toc->track[toc->num_tracks - 1];
87+
unsigned int lba = MSF2SECT(last->min, last->sec, last->frame);
88+
*total_lba = lba + last->track_size;
89+
*have_subchannel = 0;
90+
//cdrom_get_current_config_random_readable(acdrom.h);
91+
//cdrom_get_current_config_multiread(acdrom.h);
92+
//cdrom_get_current_config_cdread(acdrom.h);
93+
//cdrom_get_current_config_profiles(acdrom.h);
94+
return g_cd_handle;
95+
}
96+
}
97+
98+
void rcdrom_close(void *stream)
99+
{
100+
retro_vfs_file_close_impl(stream);
101+
}
102+
103+
int rcdrom_getTN(void *stream, u8 *tn)
104+
{
105+
const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
106+
if (toc) {
107+
tn[0] = 1;
108+
tn[1] = toc->num_tracks;
109+
return 0;
110+
}
111+
return -1;
112+
}
113+
114+
int rcdrom_getTD(void *stream, u32 total_lba, u8 track, u8 *rt)
115+
{
116+
const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
117+
rt[0] = 0, rt[1] = 2, rt[2] = 0;
118+
if (track == 0) {
119+
lba2msf(total_lba + 150, &rt[0], &rt[1], &rt[2]);
120+
}
121+
else if (track <= toc->num_tracks) {
122+
int i = track - 1;
123+
rt[0] = toc->track[i].min;
124+
rt[1] = toc->track[i].sec;
125+
rt[2] = toc->track[i].frame;
126+
}
127+
return 0;
128+
}
129+
130+
int rcdrom_getStatus(void *stream, struct CdrStat *stat)
131+
{
132+
const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
133+
stat->Type = toc->track[0].audio ? 2 : 1;
134+
return 0;
135+
}
136+
137+
int rcdrom_isMediaInserted(void *stream)
138+
{
139+
return cdrom_is_media_inserted(stream);
140+
}
141+
142+
int rcdrom_readSub(void *stream, unsigned int lba, void *b)
143+
{
144+
return -1;
145+
}
146+
69147
// vim:sw=3:ts=3:expandtab

0 commit comments

Comments
 (0)