28
28
#include "videoarch.h"
29
29
#include "palette.h"
30
#include "resources.h"
32
#include "translate.h"
31
35
#import "vicemachinenotifier.h"
32
36
#import "vicemachine.h"
33
37
#import "vicewindow.h"
35
// VICE Video Resources
40
log_t video_log = LOG_ERR;
42
// video parameter struct
43
static video_param_t video_param;
45
// ---------- VICE Video Resources ----------
47
/* tell all canvases to reconfigure after setting new video_param resources */
48
static void video_reconfigure()
50
int numCanvases = [theVICEMachine getNumCanvases];
53
for(i=0;i<numCanvases;i++) {
54
video_canvas_t *canvas = [theVICEMachine getCanvasForId:i];
56
NSData *data = [NSData dataWithBytes:&canvas length:sizeof(video_canvas_t *)];
58
// call UI thread to reconfigure canvas
59
[[theVICEMachine app] reconfigureCanvas:data];
63
static int set_sync_draw_mode(int val, void *param)
65
if((val < 0) || (val > SYNC_DRAW_LAST))
68
if(val != video_param.sync_draw_mode) {
69
video_param.sync_draw_mode = val;
74
static int set_sync_draw_buffers(int val, void *param)
81
if(val != video_param.sync_draw_buffers) {
82
video_param.sync_draw_buffers = val;
87
static int set_sync_draw_flicker_fix(int val, void *param)
94
if(val != video_param.sync_draw_flicker_fix) {
95
video_param.sync_draw_flicker_fix = val;
100
static resource_int_t resources_int[] =
102
{ "SyncDrawMode", 0, RES_EVENT_NO, NULL,
103
&video_param.sync_draw_mode, set_sync_draw_mode, NULL },
104
{ "SyncDrawBuffers", 0, RES_EVENT_NO, NULL,
105
&video_param.sync_draw_buffers, set_sync_draw_buffers, NULL },
106
{ "SyncDrawFlickerFix", 0, RES_EVENT_NO, NULL,
107
&video_param.sync_draw_flicker_fix, set_sync_draw_flicker_fix, NULL },
37
111
int video_arch_resources_init(void)
113
return resources_register_int(resources_int);
42
116
void video_arch_resources_shutdown(void)
120
// ---------- VICE Video Command Line ----------
122
static const cmdline_option_t cmdline_options[] = {
123
{ "-syncdrawmode", SET_RESOURCE, 1,
124
NULL, NULL, "SyncDrawMode", NULL,
125
USE_PARAM_STRING, USE_DESCRIPTION_STRING,
126
IDCLS_UNUSED, IDCLS_UNUSED,
127
"<0-3>", T_("Enable draw synchronization to vertical blank") },
128
{ "-syncdrawbuffers", SET_RESOURCE, 1,
129
NULL, NULL, "SyncDrawBuffers", NULL,
130
USE_PARAM_STRING, USE_DESCRIPTION_STRING,
131
IDCLS_UNUSED, IDCLS_UNUSED,
132
"<0-8>", T_("Set number of buffers used for sync draw (0=use default)") },
133
{ "-syncdrawflickerfix", SET_RESOURCE, 0,
134
NULL, NULL, "SyncDrawFlickerFix", (resource_value_t)1,
135
USE_PARAM_STRING, USE_DESCRIPTION_STRING,
136
IDCLS_UNUSED, IDCLS_UNUSED,
137
NULL, T_("Enable flicker fixing in sync draw") },
138
{ "+syncdrawflickerfix", SET_RESOURCE, 0,
139
NULL, NULL, "SyncDrawFlickerFix", (resource_value_t)0,
140
USE_PARAM_STRING, USE_DESCRIPTION_STRING,
141
IDCLS_UNUSED, IDCLS_UNUSED,
142
NULL, T_("Enable flicker fixing in sync draw") },
48
146
int video_init_cmdline_options(void)
148
return cmdline_register_options(cmdline_options);
151
// --------- init/exit MacVICE video ----------
53
153
int video_init(void)
155
if (video_log == LOG_ERR)
156
video_log = log_open("MacVideo");
58
159
void video_shutdown(void)
161
if (video_log != LOG_ERR)
162
log_close(video_log);
62
165
void video_arch_canvas_init(struct video_canvas_s *canvas)
64
168
canvas->window = nil;
170
canvas->canvasId = 0;
172
canvas->video_param = &video_param;
65
173
canvas->video_draw_buffer_callback = NULL;
145
255
w = MIN(w, canvas->width - xi);
146
256
h = MIN(h, canvas->height - yi);
148
// render into texture buffer
149
video_canvas_render(canvas, canvas->buffer,
258
// get drawing buffer
259
VICEGLView *view = canvas->view;
260
BYTE *buffer = [view beginMachineDraw:vsync_frame_counter];
266
video_canvas_render(canvas, buffer,
150
267
w, h, xs, ys, xi, yi,
151
268
canvas->pitch, canvas->depth);
154
// call updateCanvas selector in main thread - non-blocking
155
VICEWindow *window = canvas->window;
156
[window performSelectorOnMainThread:@selector(updateCanvas:)
160
// call updateCanvas via proxy object - blocks if main app blocks
161
// encapsulate canvas ptr
162
video_canvas_t *canvasPtr = canvas;
163
NSData *data = [NSData dataWithBytes:&canvasPtr length:sizeof(video_canvas_t *)];
164
// call UI thread to resize canvas
165
[[theVICEMachine app] updateCanvas:data];
270
// notify end drawing
271
[view endMachineDraw];
169
274
// ----- Palette Stuff -----
185
292
for (i = 0; i < p->num_entries; i++)
191
case 16: /* RGB 5:5:5 */
193
rbits = 3; rshift = 10; rmask = 0x1f;
194
gbits = 3; gshift = 5; gmask = 0x1f;
195
bbits = 3; bshift = 0; bmask = 0x1f;
197
case 32: /* RGB 8:8:8 */
199
rbits = 0; rshift = 16; rmask = 0xff;
200
gbits = 0; gshift = 8; gmask = 0xff;
201
bbits = 0; bshift = 0; bmask = 0xff;
296
rbits = 0; rshift = 16; rmask = 0xff;
297
gbits = 0; gshift = 8; gmask = 0xff;
298
bbits = 0; bshift = 0; bmask = 0xff;
203
300
col = (p->entries[i].red >> rbits) << rshift
204
301
| (p->entries[i].green >> gbits) << gshift
205
| (p->entries[i].blue >> bbits) << bshift;
302
| (p->entries[i].blue >> bbits) << bshift
303
| 0xff000000; // alpha
207
305
video_render_setphysicalcolor(c->videoconfig, i, col, c->depth);
308
// set colors for palemu
309
for (i = 0; i < 256; i++)
211
for (i = 0; i < 256; i++)
213
video_render_setrawrgb(i,
214
((i & (rmask << rbits)) >> rbits) << rshift,
215
((i & (gmask << gbits)) >> gbits) << gshift,
216
((i & (bmask << bbits)) >> bbits) << bshift);
218
video_render_initraw();
311
video_render_setrawrgb(i,
312
((i & (rmask << rbits)) >> rbits) << rshift,
313
((i & (gmask << gbits)) >> gbits) << gshift,
314
((i & (bmask << bbits)) >> bbits) << bshift);
316
video_render_setrawalpha(0xff000000);
317
video_render_initraw();