Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 113.79 KB | None | 0 0
  1. diff --git a/src/sound.c b/src/sound.c
  2. index 0bb5f92..b361f35 100644
  3. --- a/src/sound.c
  4. +++ b/src/sound.c
  5. @@ -213,7 +213,7 @@ void sound_init()
  6. outbuffer = malloc(MAXSOUNDBUFLEN * 2 * sizeof(int32_t));
  7.  
  8. sound_cd_event = thread_create_event();
  9. - sound_cd_thread_h = thread_create(sound_cd_thread, NULL);
  10. + //sound_cd_thread_h = thread_create(sound_cd_thread, NULL);
  11. }
  12.  
  13. void sound_add_handler(void (*get_buffer)(int32_t *buffer, int len, void *p), void *p)
  14. diff --git a/src/vid_s3_virge.c b/src/vid_s3_virge.c
  15. index 3039969..d6e69e8 100644
  16. --- a/src/vid_s3_virge.c
  17. +++ b/src/vid_s3_virge.c
  18. @@ -34,21 +34,6 @@ static int dither[4][4] =
  19. {7, 3, 6, 2},
  20. };
  21.  
  22. -#define RB_SIZE 256
  23. -#define RB_MASK (RB_SIZE - 1)
  24. -
  25. -#define RB_ENTRIES (virge->s3d_write_idx - virge->s3d_read_idx)
  26. -#define RB_FULL (RB_ENTRIES == RB_SIZE)
  27. -#define RB_EMPTY (!RB_ENTRIES)
  28. -
  29. -#define FIFO_SIZE 65536
  30. -#define FIFO_MASK (FIFO_SIZE - 1)
  31. -#define FIFO_ENTRY_SIZE (1 << 31)
  32. -
  33. -#define FIFO_ENTRIES (virge->fifo_write_idx - virge->fifo_read_idx)
  34. -#define FIFO_FULL ((virge->fifo_write_idx - virge->fifo_read_idx) >= FIFO_SIZE)
  35. -#define FIFO_EMPTY (virge->fifo_read_idx == virge->fifo_write_idx)
  36. -
  37. #define FIFO_TYPE 0xff000000
  38. #define FIFO_ADDR 0x00ffffff
  39.  
  40. @@ -60,20 +45,14 @@ enum
  41. FIFO_WRITE_DWORD = (0x03 << 24),
  42. };
  43.  
  44. -typedef struct
  45. -{
  46. - uint32_t addr_type;
  47. - uint32_t val;
  48. -} fifo_entry_t;
  49. -
  50. typedef struct s3d_t
  51. {
  52. uint32_t cmd_set;
  53. int clip_l, clip_r, clip_t, clip_b;
  54. -
  55. +
  56. uint32_t dest_base;
  57. uint32_t dest_str;
  58. -
  59. +
  60. uint32_t z_base;
  61. uint32_t z_str;
  62.  
  63. @@ -89,14 +68,14 @@ typedef struct s3d_t
  64.  
  65. int32_t TdWdX, TdWdY;
  66. uint32_t tws;
  67. -
  68. +
  69. int32_t TdDdX, TdDdY;
  70. uint32_t tds;
  71. -
  72. +
  73. int16_t TdGdX, TdBdX, TdRdX, TdAdX;
  74. int16_t TdGdY, TdBdY, TdRdY, TdAdY;
  75. uint32_t tgs, tbs, trs, tas;
  76. -
  77. +
  78. uint32_t TdXdY12;
  79. uint32_t txend12;
  80. uint32_t TdXdY01;
  81. @@ -106,17 +85,17 @@ typedef struct s3d_t
  82. uint32_t tys;
  83. int ty01, ty12, tlr;
  84. } s3d_t;
  85. -
  86. +
  87. typedef struct virge_t
  88. {
  89. mem_mapping_t linear_mapping;
  90. mem_mapping_t mmio_mapping;
  91. mem_mapping_t new_mmio_mapping;
  92. -
  93. +
  94. rom_t bios_rom;
  95. -
  96. +
  97. svga_t svga;
  98. -
  99. +
  100. uint8_t bank;
  101. uint8_t ma_ext;
  102.  
  103. @@ -132,17 +111,12 @@ typedef struct virge_t
  104. int bilinear_enabled;
  105. int dithering_enabled;
  106. int memory_size;
  107. -
  108. +
  109. int pixel_count, tri_count;
  110. -
  111. - thread_t *render_thread;
  112. - event_t *wake_render_thread;
  113. - event_t *wake_main_thread;
  114. - event_t *not_full_event;
  115. -
  116. +
  117. uint32_t hwc_fg_col, hwc_bg_col;
  118. int hwc_col_stack_pos;
  119. -
  120. +
  121. struct
  122. {
  123. uint32_t src_base;
  124. @@ -159,21 +133,21 @@ typedef struct virge_t
  125. int r_width, r_height;
  126. int rsrc_x, rsrc_y;
  127. int rdest_x, rdest_y;
  128. -
  129. +
  130. int lxend0, lxend1;
  131. int32_t ldx;
  132. uint32_t lxstart, lystart;
  133. int lycnt;
  134. int line_dir;
  135. -
  136. +
  137. int src_x, src_y;
  138. int dest_x, dest_y;
  139. int w, h;
  140. uint8_t rop;
  141. -
  142. +
  143. int data_left_count;
  144. uint32_t data_left;
  145. -
  146. +
  147. uint32_t pattern_8[8*8];
  148. uint32_t pattern_16[8*8];
  149. uint32_t pattern_32[8*8];
  150. @@ -186,13 +160,9 @@ typedef struct virge_t
  151. uint32_t pycnt;
  152. uint32_t dest_l, dest_r;
  153. } s3d;
  154. -
  155. +
  156. s3d_t s3d_tri;
  157.  
  158. - s3d_t s3d_buffer[RB_SIZE];
  159. - int s3d_read_idx, s3d_write_idx;
  160. - int s3d_busy;
  161. -
  162. struct
  163. {
  164. uint32_t pri_ctrl;
  165. @@ -218,30 +188,18 @@ typedef struct virge_t
  166. uint32_t pri_size;
  167. uint32_t sec_start;
  168. uint32_t sec_size;
  169. -
  170. +
  171. int sdif;
  172. -
  173. +
  174. int pri_x, pri_y, pri_w, pri_h;
  175. int sec_x, sec_y, sec_w, sec_h;
  176. } streams;
  177.  
  178. - fifo_entry_t fifo[FIFO_SIZE];
  179. - volatile int fifo_read_idx, fifo_write_idx;
  180. -
  181. - thread_t *fifo_thread;
  182. - event_t *wake_fifo_thread;
  183. - event_t *fifo_not_full_event;
  184. -
  185. int virge_busy;
  186. -
  187. +
  188. uint8_t subsys_stat, subsys_cntl;
  189. } virge_t;
  190.  
  191. -static inline void wake_fifo_thread(virge_t *virge)
  192. -{
  193. - thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/
  194. -}
  195. -
  196. static void queue_triangle(virge_t *virge);
  197.  
  198. static void s3_virge_recalctimings(svga_t *svga);
  199. @@ -260,29 +218,29 @@ enum
  200. {
  201. CMD_SET_AE = 1,
  202. CMD_SET_HC = (1 << 1),
  203. -
  204. +
  205. CMD_SET_FORMAT_MASK = (7 << 2),
  206. CMD_SET_FORMAT_8 = (0 << 2),
  207. CMD_SET_FORMAT_16 = (1 << 2),
  208. CMD_SET_FORMAT_24 = (2 << 2),
  209. -
  210. +
  211. CMD_SET_MS = (1 << 6),
  212. CMD_SET_IDS = (1 << 7),
  213. CMD_SET_MP = (1 << 8),
  214. CMD_SET_TP = (1 << 9),
  215. -
  216. +
  217. CMD_SET_ITA_MASK = (3 << 10),
  218. CMD_SET_ITA_BYTE = (0 << 10),
  219. CMD_SET_ITA_WORD = (1 << 10),
  220. CMD_SET_ITA_DWORD = (2 << 10),
  221. -
  222. +
  223. CMD_SET_ZUP = (1 << 23),
  224. -
  225. +
  226. CMD_SET_ZB_MODE = (3 << 24),
  227.  
  228. CMD_SET_XP = (1 << 25),
  229. CMD_SET_YP = (1 << 26),
  230. -
  231. +
  232. CMD_SET_COMMAND_MASK = (15 << 27)
  233. };
  234.  
  235. @@ -320,9 +278,9 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
  236. svga_t *svga = &virge->svga;
  237. uint8_t old;
  238.  
  239. - if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
  240. + if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
  241. addr ^= 0x60;
  242. -
  243. +
  244. // pclog("S3 out %04X %02X %04X:%08X %04X %04X %i\n", addr, val, CS, pc, ES, BX, ins);
  245.  
  246. switch (addr)
  247. @@ -340,7 +298,7 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
  248. else svga->write_bank = svga->read_bank = virge->bank << 14;
  249. }
  250. break;
  251. -
  252. +
  253. //case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9:
  254. // pclog("Write RAMDAC %04X %02X %04X:%04X\n", addr, val, CS, pc);
  255. //sdac_ramdac_out(addr,val);
  256. @@ -355,7 +313,7 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
  257. return;
  258. if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80))
  259. val = (svga->crtc[7] & ~0x10) | (val & 0x10);
  260. - if (svga->crtcreg >= 0x20 && svga->crtcreg != 0x38 && (svga->crtc[0x38] & 0xcc) != 0x48)
  261. + if (svga->crtcreg >= 0x20 && svga->crtcreg != 0x38 && (svga->crtc[0x38] & 0xcc) != 0x48)
  262. return;
  263. if (svga->crtcreg >= 0x80)
  264. return;
  265. @@ -369,11 +327,11 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
  266. case 0x32:
  267. s3_virge_update_irqs(virge);
  268. break;
  269. -
  270. +
  271. case 0x69:
  272. virge->ma_ext = val & 0x1f;
  273. break;
  274. -
  275. +
  276. case 0x35:
  277. virge->bank = (virge->bank & 0x70) | (val & 0xf);
  278. // pclog("CRTC write R35 %02X\n", val);
  279. @@ -392,11 +350,11 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
  280. if (svga->chain4) svga->write_bank = svga->read_bank = virge->bank << 16;
  281. else svga->write_bank = svga->read_bank = virge->bank << 14;
  282. break;
  283. -
  284. +
  285. case 0x3a:
  286. if (val & 0x10) svga->gdcreg[5] |= 0x40; /*Horrible cheat*/
  287. break;
  288. -
  289. +
  290. case 0x45:
  291. svga->hwcursor.ena = val & 1;
  292. break;
  293. @@ -408,7 +366,7 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
  294. svga->hwcursor.yoff = svga->crtc[0x4f] & 63;
  295. svga->hwcursor.addr = ((((svga->crtc[0x4c] << 8) | svga->crtc[0x4d]) & 0xfff) * 1024) + (svga->hwcursor.yoff * 16);
  296. break;
  297. -
  298. +
  299. case 0x4a:
  300. switch (virge->hwc_col_stack_pos)
  301. {
  302. @@ -444,7 +402,7 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
  303. case 0x58: case 0x59: case 0x5a:
  304. s3_virge_updatemapping(virge);
  305. break;
  306. -
  307. +
  308. case 0x67:
  309. switch (val >> 4)
  310. {
  311. @@ -476,8 +434,8 @@ static uint8_t s3_virge_in(uint16_t addr, void *p)
  312. virge_t *virge = (virge_t *)p;
  313. svga_t *svga = &virge->svga;
  314. uint8_t ret;
  315. -
  316. - if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
  317. +
  318. + if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
  319. addr ^= 0x60;
  320.  
  321. // if (addr != 0x3da) pclog("S3 in %04X %04X:%08X ", addr, CS, pc);
  322. @@ -488,7 +446,7 @@ static uint8_t s3_virge_in(uint16_t addr, void *p)
  323. ret = 0xff;
  324. else
  325. ret = svga_in(addr, svga);
  326. - break;
  327. + break;
  328. //case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9:
  329. // pclog("Read RAMDAC %04X %04X:%04X\n", addr, CS, pc);
  330. //return sdac_ramdac_in(addr);
  331. @@ -511,7 +469,7 @@ static uint8_t s3_virge_in(uint16_t addr, void *p)
  332. {
  333. case 0x2d: ret = virge->virge_id_high; break; /*Extended chip ID*/
  334. case 0x2e: ret = virge->virge_id_low; break; /*New chip ID*/
  335. - case 0x2f: ret = virge->virge_rev; break;
  336. + case 0x2f: ret = virge->virge_rev; break;
  337. case 0x30: ret = virge->virge_id; break; /*Chip ID*/
  338. case 0x31: ret = (svga->crtc[0x31] & 0xcf) | ((virge->ma_ext & 3) << 4); break;
  339. case 0x35: ret = (svga->crtc[0x35] & 0xf0) | (virge->bank & 0xf); break;
  340. @@ -523,10 +481,10 @@ static uint8_t s3_virge_in(uint16_t addr, void *p)
  341. default: ret = svga->crtc[svga->crtcreg]; break;
  342. }
  343. break;
  344. -
  345. +
  346. default:
  347. ret = svga_in(addr, svga);
  348. - break;
  349. + break;
  350. }
  351. // if (addr != 0x3da) pclog("%02X\n", ret);
  352. return ret;
  353. @@ -557,24 +515,24 @@ static void s3_virge_recalctimings(svga_t *svga)
  354. {
  355. switch (svga->bpp)
  356. {
  357. - case 8:
  358. - svga->render = svga_render_8bpp_highres;
  359. + case 8:
  360. + svga->render = svga_render_8bpp_highres;
  361. break;
  362. - case 15:
  363. - svga->render = svga_render_15bpp_highres;
  364. + case 15:
  365. + svga->render = svga_render_15bpp_highres;
  366. break;
  367. - case 16:
  368. - svga->render = svga_render_16bpp_highres;
  369. + case 16:
  370. + svga->render = svga_render_16bpp_highres;
  371. break;
  372. - case 24:
  373. - svga->render = svga_render_24bpp_highres;
  374. + case 24:
  375. + svga->render = svga_render_24bpp_highres;
  376. break;
  377. - case 32:
  378. - svga->render = svga_render_32bpp_highres;
  379. + case 32:
  380. + svga->render = svga_render_32bpp_highres;
  381. break;
  382. }
  383. }
  384. -
  385. +
  386. // pclog("svga->rowoffset = %i bpp=%i\n", svga->rowoffset, svga->bpp);
  387. if (svga->bpp == 15 || svga->bpp == 16)
  388. {
  389. @@ -594,11 +552,11 @@ static void s3_virge_recalctimings(svga_t *svga)
  390. svga->ma_latch = virge->streams.pri_fb1 >> 2;
  391. else
  392. svga->ma_latch = virge->streams.pri_fb0 >> 2;
  393. -
  394. +
  395. svga->hdisp = virge->streams.pri_w + 1;
  396. if (virge->streams.pri_h < svga->dispend)
  397. svga->dispend = virge->streams.pri_h;
  398. -
  399. +
  400. svga->overlay.x = virge->streams.sec_x - virge->streams.pri_x;
  401. svga->overlay.y = virge->streams.sec_y - virge->streams.pri_y;
  402. svga->overlay.ysize = virge->streams.sec_h;
  403. @@ -616,21 +574,21 @@ static void s3_virge_recalctimings(svga_t *svga)
  404. switch ((virge->streams.pri_ctrl >> 24) & 0x7)
  405. {
  406. case 0: /*RGB-8 (CLUT)*/
  407. - svga->render = svga_render_8bpp_highres;
  408. + svga->render = svga_render_8bpp_highres;
  409. break;
  410. - case 3: /*KRGB-16 (1.5.5.5)*/
  411. + case 3: /*KRGB-16 (1.5.5.5)*/
  412. svga->htotal >>= 1;
  413. - svga->render = svga_render_15bpp_highres;
  414. + svga->render = svga_render_15bpp_highres;
  415. break;
  416. - case 5: /*RGB-16 (5.6.5)*/
  417. + case 5: /*RGB-16 (5.6.5)*/
  418. svga->htotal >>= 1;
  419. - svga->render = svga_render_16bpp_highres;
  420. + svga->render = svga_render_16bpp_highres;
  421. break;
  422. - case 6: /*RGB-24 (8.8.8)*/
  423. - svga->render = svga_render_24bpp_highres;
  424. + case 6: /*RGB-24 (8.8.8)*/
  425. + svga->render = svga_render_24bpp_highres;
  426. break;
  427. case 7: /*XRGB-32 (X.8.8.8)*/
  428. - svga->render = svga_render_32bpp_highres;
  429. + svga->render = svga_render_32bpp_highres;
  430. break;
  431. }
  432. svga->vram_display_mask = (virge->memory_size << 20) - 1;
  433. @@ -661,7 +619,7 @@ static void s3_virge_updatemapping(virge_t *virge)
  434. return;
  435. }
  436.  
  437. - pclog("Update mapping - bank %02X ", svga->gdcreg[6] & 0xc);
  438. + pclog("Update mapping - bank %02X ", svga->gdcreg[6] & 0xc);
  439. switch (svga->gdcreg[6] & 0xc) /*Banked framebuffer*/
  440. {
  441. case 0x0: /*128k at A0000*/
  442. @@ -681,9 +639,9 @@ static void s3_virge_updatemapping(virge_t *virge)
  443. svga->banked_mask = 0x7fff;
  444. break;
  445. }
  446. -
  447. +
  448. virge->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24);
  449. -
  450. +
  451. pclog("Linear framebuffer %02X ", svga->crtc[0x58] & 0x10);
  452. if (svga->crtc[0x58] & 0x10) /*Linear framebuffer*/
  453. {
  454. @@ -719,7 +677,7 @@ static void s3_virge_updatemapping(virge_t *virge)
  455. mem_mapping_disable(&virge->linear_mapping);
  456. svga->fb_only = 0;
  457. }
  458. -
  459. +
  460. pclog("Memory mapped IO %02X\n", svga->crtc[0x53] & 0x18);
  461. if (svga->crtc[0x53] & 0x10) /*Old MMIO*/
  462. {
  463. @@ -746,15 +704,6 @@ static void s3_virge_vblank_start(svga_t *svga)
  464. s3_virge_update_irqs(virge);
  465. }
  466.  
  467. -static void s3_virge_wait_fifo_idle(virge_t *virge)
  468. -{
  469. - while (!FIFO_EMPTY)
  470. - {
  471. - wake_fifo_thread(virge);
  472. - thread_wait_event(virge->fifo_not_full_event, 1);
  473. - }
  474. -}
  475. -
  476. static uint8_t s3_virge_mmio_read(uint32_t addr, void *p)
  477. {
  478. virge_t *virge = (virge_t *)p;
  479. @@ -765,14 +714,9 @@ static uint8_t s3_virge_mmio_read(uint32_t addr, void *p)
  480. switch (addr & 0xffff)
  481. {
  482. case 0x8505:
  483. - if (virge->s3d_busy || virge->virge_busy || !FIFO_EMPTY)
  484. - ret = 0x10;
  485. - else
  486. - ret = 0x10 | (1 << 5);
  487. - if (!virge->virge_busy)
  488. - wake_fifo_thread(virge);
  489. + ret = 0x10 | (1 << 5);
  490. return ret;
  491. -
  492. +
  493. case 0x83b0: case 0x83b1: case 0x83b2: case 0x83b3:
  494. case 0x83b4: case 0x83b5: case 0x83b6: case 0x83b7:
  495. case 0x83b8: case 0x83b9: case 0x83ba: case 0x83bb:
  496. @@ -874,78 +818,58 @@ static uint32_t s3_virge_mmio_read_l(uint32_t addr, void *p)
  497. case 0x81fc:
  498. ret = virge->streams.sec_size;
  499. break;
  500. -
  501. +
  502. case 0x8504:
  503. - if (virge->s3d_busy || virge->virge_busy || !FIFO_EMPTY)
  504. - ret = (0x10 << 8);
  505. - else
  506. - ret = (0x10 << 8) | (1 << 13);
  507. + ret = (0x10 << 8) | (1 << 13);
  508. ret |= virge->subsys_stat;
  509. - if (!virge->virge_busy)
  510. - wake_fifo_thread(virge);
  511. // pclog("Read status %04x %i\n", ret, virge->s3d_busy);
  512. break;
  513. case 0xa4d4:
  514. - s3_virge_wait_fifo_idle(virge);
  515. ret = virge->s3d.src_base;
  516. break;
  517. case 0xa4d8:
  518. - s3_virge_wait_fifo_idle(virge);
  519. ret = virge->s3d.dest_base;
  520. break;
  521. case 0xa4dc:
  522. - s3_virge_wait_fifo_idle(virge);
  523. ret = (virge->s3d.clip_l << 16) | virge->s3d.clip_r;
  524. break;
  525. case 0xa4e0:
  526. - s3_virge_wait_fifo_idle(virge);
  527. ret = (virge->s3d.clip_t << 16) | virge->s3d.clip_b;
  528. break;
  529. case 0xa4e4:
  530. - s3_virge_wait_fifo_idle(virge);
  531. ret = (virge->s3d.dest_str << 16) | virge->s3d.src_str;
  532. break;
  533. case 0xa4e8: case 0xace8:
  534. - s3_virge_wait_fifo_idle(virge);
  535. ret = virge->s3d.mono_pat_0;
  536. break;
  537. case 0xa4ec: case 0xacec:
  538. - s3_virge_wait_fifo_idle(virge);
  539. ret = virge->s3d.mono_pat_1;
  540. break;
  541. case 0xa4f0:
  542. - s3_virge_wait_fifo_idle(virge);
  543. ret = virge->s3d.pat_bg_clr;
  544. break;
  545. case 0xa4f4:
  546. - s3_virge_wait_fifo_idle(virge);
  547. ret = virge->s3d.pat_fg_clr;
  548. break;
  549. case 0xa4f8:
  550. - s3_virge_wait_fifo_idle(virge);
  551. ret = virge->s3d.src_bg_clr;
  552. break;
  553. case 0xa4fc:
  554. - s3_virge_wait_fifo_idle(virge);
  555. ret = virge->s3d.src_fg_clr;
  556. break;
  557. case 0xa500:
  558. - s3_virge_wait_fifo_idle(virge);
  559. ret = virge->s3d.cmd_set;
  560. break;
  561. case 0xa504:
  562. - s3_virge_wait_fifo_idle(virge);
  563. ret = (virge->s3d.r_width << 16) | virge->s3d.r_height;
  564. break;
  565. case 0xa508:
  566. - s3_virge_wait_fifo_idle(virge);
  567. ret = (virge->s3d.rsrc_x << 16) | virge->s3d.rsrc_y;
  568. break;
  569. case 0xa50c:
  570. - s3_virge_wait_fifo_idle(virge);
  571. ret = (virge->s3d.rdest_x << 16) | virge->s3d.rdest_y;
  572. break;
  573. -
  574. +
  575. default:
  576. ret = s3_virge_mmio_read_w(addr, p) | (s3_virge_mmio_read_w(addr + 2, p) << 16);
  577. }
  578. @@ -953,388 +877,345 @@ static uint32_t s3_virge_mmio_read_l(uint32_t addr, void *p)
  579. return ret;
  580. }
  581.  
  582. -static void fifo_thread(void *param)
  583. +static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type)
  584. {
  585. - virge_t *virge = (virge_t *)param;
  586. -
  587. - while (1)
  588. + uint64_t start_time = timer_read();
  589. + uint64_t end_time;
  590. + uint32_t addr_type = (addr & FIFO_ADDR) | type;
  591. +
  592. + switch (addr_type & FIFO_TYPE)
  593. {
  594. - thread_set_event(virge->fifo_not_full_event);
  595. - thread_wait_event(virge->wake_fifo_thread, -1);
  596. - thread_reset_event(virge->wake_fifo_thread);
  597. - virge->virge_busy = 1;
  598. - while (!FIFO_EMPTY)
  599. + case FIFO_WRITE_BYTE:
  600. + if (((addr_type & FIFO_ADDR) & 0xfffc) < 0x8000)
  601. + s3_virge_bitblt(virge, 8, val);
  602. + break;
  603. + case FIFO_WRITE_WORD:
  604. + if (((addr_type & FIFO_ADDR) & 0xfffc) < 0x8000)
  605. {
  606. - uint64_t start_time = timer_read();
  607. - uint64_t end_time;
  608. - fifo_entry_t *fifo = &virge->fifo[virge->fifo_read_idx & FIFO_MASK];
  609. - uint32_t val = fifo->val;
  610. -
  611. - switch (fifo->addr_type & FIFO_TYPE)
  612. + if (virge->s3d.cmd_set & CMD_SET_MS)
  613. + s3_virge_bitblt(virge, 16, ((val >> 8) | (val << 8)) << 16);
  614. + else
  615. + s3_virge_bitblt(virge, 16, val);
  616. + }
  617. + break;
  618. + case FIFO_WRITE_DWORD:
  619. + if (((addr_type & FIFO_ADDR) & 0xfffc) < 0x8000)
  620. + {
  621. + if (virge->s3d.cmd_set & CMD_SET_MS)
  622. + s3_virge_bitblt(virge, 32, ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24));
  623. + else
  624. + s3_virge_bitblt(virge, 32, val);
  625. + }
  626. + else
  627. + {
  628. + switch ((addr_type & FIFO_ADDR) & 0xfffc)
  629. {
  630. - case FIFO_WRITE_BYTE:
  631. - if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000)
  632. - s3_virge_bitblt(virge, 8, val);
  633. - break;
  634. - case FIFO_WRITE_WORD:
  635. - if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000)
  636. + case 0xa000: case 0xa004: case 0xa008: case 0xa00c:
  637. + case 0xa010: case 0xa014: case 0xa018: case 0xa01c:
  638. + case 0xa020: case 0xa024: case 0xa028: case 0xa02c:
  639. + case 0xa030: case 0xa034: case 0xa038: case 0xa03c:
  640. + case 0xa040: case 0xa044: case 0xa048: case 0xa04c:
  641. + case 0xa050: case 0xa054: case 0xa058: case 0xa05c:
  642. + case 0xa060: case 0xa064: case 0xa068: case 0xa06c:
  643. + case 0xa070: case 0xa074: case 0xa078: case 0xa07c:
  644. + case 0xa080: case 0xa084: case 0xa088: case 0xa08c:
  645. + case 0xa090: case 0xa094: case 0xa098: case 0xa09c:
  646. + case 0xa0a0: case 0xa0a4: case 0xa0a8: case 0xa0ac:
  647. + case 0xa0b0: case 0xa0b4: case 0xa0b8: case 0xa0bc:
  648. + case 0xa0c0: case 0xa0c4: case 0xa0c8: case 0xa0cc:
  649. + case 0xa0d0: case 0xa0d4: case 0xa0d8: case 0xa0dc:
  650. + case 0xa0e0: case 0xa0e4: case 0xa0e8: case 0xa0ec:
  651. + case 0xa0f0: case 0xa0f4: case 0xa0f8: case 0xa0fc:
  652. + case 0xa100: case 0xa104: case 0xa108: case 0xa10c:
  653. + case 0xa110: case 0xa114: case 0xa118: case 0xa11c:
  654. + case 0xa120: case 0xa124: case 0xa128: case 0xa12c:
  655. + case 0xa130: case 0xa134: case 0xa138: case 0xa13c:
  656. + case 0xa140: case 0xa144: case 0xa148: case 0xa14c:
  657. + case 0xa150: case 0xa154: case 0xa158: case 0xa15c:
  658. + case 0xa160: case 0xa164: case 0xa168: case 0xa16c:
  659. + case 0xa170: case 0xa174: case 0xa178: case 0xa17c:
  660. + case 0xa180: case 0xa184: case 0xa188: case 0xa18c:
  661. + case 0xa190: case 0xa194: case 0xa198: case 0xa19c:
  662. + case 0xa1a0: case 0xa1a4: case 0xa1a8: case 0xa1ac:
  663. + case 0xa1b0: case 0xa1b4: case 0xa1b8: case 0xa1bc:
  664. + case 0xa1c0: case 0xa1c4: case 0xa1c8: case 0xa1cc:
  665. + case 0xa1d0: case 0xa1d4: case 0xa1d8: case 0xa1dc:
  666. + case 0xa1e0: case 0xa1e4: case 0xa1e8: case 0xa1ec:
  667. + case 0xa1f0: case 0xa1f4: case 0xa1f8: case 0xa1fc:
  668. {
  669. - if (virge->s3d.cmd_set & CMD_SET_MS)
  670. - s3_virge_bitblt(virge, 16, ((val >> 8) | (val << 8)) << 16);
  671. - else
  672. - s3_virge_bitblt(virge, 16, val);
  673. + int x = (addr_type & FIFO_ADDR) & 4;
  674. + int y = ((addr_type & FIFO_ADDR) >> 3) & 7;
  675. + virge->s3d.pattern_8[y*8 + x] = val & 0xff;
  676. + virge->s3d.pattern_8[y*8 + x + 1] = val >> 8;
  677. + virge->s3d.pattern_8[y*8 + x + 2] = val >> 16;
  678. + virge->s3d.pattern_8[y*8 + x + 3] = val >> 24;
  679. +
  680. + x = ((addr_type & FIFO_ADDR) >> 1) & 6;
  681. + y = ((addr_type & FIFO_ADDR) >> 4) & 7;
  682. + virge->s3d.pattern_16[y*8 + x] = val & 0xffff;
  683. + virge->s3d.pattern_16[y*8 + x + 1] = val >> 16;
  684. +
  685. + x = ((addr_type & FIFO_ADDR) >> 2) & 7;
  686. + y = ((addr_type & FIFO_ADDR) >> 5) & 7;
  687. + virge->s3d.pattern_32[y*8 + x] = val & 0xffffff;
  688. }
  689. break;
  690. - case FIFO_WRITE_DWORD:
  691. - if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000)
  692. - {
  693. - if (virge->s3d.cmd_set & CMD_SET_MS)
  694. - s3_virge_bitblt(virge, 32, ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24));
  695. - else
  696. - s3_virge_bitblt(virge, 32, val);
  697. - }
  698. - else
  699. - {
  700. - switch ((fifo->addr_type & FIFO_ADDR) & 0xfffc)
  701. - {
  702. - case 0xa000: case 0xa004: case 0xa008: case 0xa00c:
  703. - case 0xa010: case 0xa014: case 0xa018: case 0xa01c:
  704. - case 0xa020: case 0xa024: case 0xa028: case 0xa02c:
  705. - case 0xa030: case 0xa034: case 0xa038: case 0xa03c:
  706. - case 0xa040: case 0xa044: case 0xa048: case 0xa04c:
  707. - case 0xa050: case 0xa054: case 0xa058: case 0xa05c:
  708. - case 0xa060: case 0xa064: case 0xa068: case 0xa06c:
  709. - case 0xa070: case 0xa074: case 0xa078: case 0xa07c:
  710. - case 0xa080: case 0xa084: case 0xa088: case 0xa08c:
  711. - case 0xa090: case 0xa094: case 0xa098: case 0xa09c:
  712. - case 0xa0a0: case 0xa0a4: case 0xa0a8: case 0xa0ac:
  713. - case 0xa0b0: case 0xa0b4: case 0xa0b8: case 0xa0bc:
  714. - case 0xa0c0: case 0xa0c4: case 0xa0c8: case 0xa0cc:
  715. - case 0xa0d0: case 0xa0d4: case 0xa0d8: case 0xa0dc:
  716. - case 0xa0e0: case 0xa0e4: case 0xa0e8: case 0xa0ec:
  717. - case 0xa0f0: case 0xa0f4: case 0xa0f8: case 0xa0fc:
  718. - case 0xa100: case 0xa104: case 0xa108: case 0xa10c:
  719. - case 0xa110: case 0xa114: case 0xa118: case 0xa11c:
  720. - case 0xa120: case 0xa124: case 0xa128: case 0xa12c:
  721. - case 0xa130: case 0xa134: case 0xa138: case 0xa13c:
  722. - case 0xa140: case 0xa144: case 0xa148: case 0xa14c:
  723. - case 0xa150: case 0xa154: case 0xa158: case 0xa15c:
  724. - case 0xa160: case 0xa164: case 0xa168: case 0xa16c:
  725. - case 0xa170: case 0xa174: case 0xa178: case 0xa17c:
  726. - case 0xa180: case 0xa184: case 0xa188: case 0xa18c:
  727. - case 0xa190: case 0xa194: case 0xa198: case 0xa19c:
  728. - case 0xa1a0: case 0xa1a4: case 0xa1a8: case 0xa1ac:
  729. - case 0xa1b0: case 0xa1b4: case 0xa1b8: case 0xa1bc:
  730. - case 0xa1c0: case 0xa1c4: case 0xa1c8: case 0xa1cc:
  731. - case 0xa1d0: case 0xa1d4: case 0xa1d8: case 0xa1dc:
  732. - case 0xa1e0: case 0xa1e4: case 0xa1e8: case 0xa1ec:
  733. - case 0xa1f0: case 0xa1f4: case 0xa1f8: case 0xa1fc:
  734. - {
  735. - int x = (fifo->addr_type & FIFO_ADDR) & 4;
  736. - int y = ((fifo->addr_type & FIFO_ADDR) >> 3) & 7;
  737. - virge->s3d.pattern_8[y*8 + x] = val & 0xff;
  738. - virge->s3d.pattern_8[y*8 + x + 1] = val >> 8;
  739. - virge->s3d.pattern_8[y*8 + x + 2] = val >> 16;
  740. - virge->s3d.pattern_8[y*8 + x + 3] = val >> 24;
  741. -
  742. - x = ((fifo->addr_type & FIFO_ADDR) >> 1) & 6;
  743. - y = ((fifo->addr_type & FIFO_ADDR) >> 4) & 7;
  744. - virge->s3d.pattern_16[y*8 + x] = val & 0xffff;
  745. - virge->s3d.pattern_16[y*8 + x + 1] = val >> 16;
  746. -
  747. - x = ((fifo->addr_type & FIFO_ADDR) >> 2) & 7;
  748. - y = ((fifo->addr_type & FIFO_ADDR) >> 5) & 7;
  749. - virge->s3d.pattern_32[y*8 + x] = val & 0xffffff;
  750. - }
  751. - break;
  752.  
  753. - case 0xa4d4: case 0xa8d4:
  754. - virge->s3d.src_base = val & 0x3ffff8;
  755. - break;
  756. - case 0xa4d8: case 0xa8d8:
  757. - virge->s3d.dest_base = val & 0x3ffff8;
  758. - break;
  759. - case 0xa4dc: case 0xa8dc:
  760. - virge->s3d.clip_l = (val >> 16) & 0x7ff;
  761. - virge->s3d.clip_r = val & 0x7ff;
  762. - break;
  763. - case 0xa4e0: case 0xa8e0:
  764. - virge->s3d.clip_t = (val >> 16) & 0x7ff;
  765. - virge->s3d.clip_b = val & 0x7ff;
  766. - break;
  767. - case 0xa4e4: case 0xa8e4:
  768. - virge->s3d.dest_str = (val >> 16) & 0xff8;
  769. - virge->s3d.src_str = val & 0xff8;
  770. - break;
  771. - case 0xa4e8: case 0xace8:
  772. - virge->s3d.mono_pat_0 = val;
  773. - break;
  774. - case 0xa4ec: case 0xacec:
  775. - virge->s3d.mono_pat_1 = val;
  776. - break;
  777. - case 0xa4f0: case 0xacf0:
  778. - virge->s3d.pat_bg_clr = val;
  779. - break;
  780. - case 0xa4f4: case 0xa8f4: case 0xacf4:
  781. - virge->s3d.pat_fg_clr = val;
  782. - break;
  783. - case 0xa4f8:
  784. - virge->s3d.src_bg_clr = val;
  785. - break;
  786. - case 0xa4fc:
  787. - virge->s3d.src_fg_clr = val;
  788. - break;
  789. - case 0xa500: case 0xa900:
  790. - virge->s3d.cmd_set = val;
  791. - if (!(val & CMD_SET_AE))
  792. - s3_virge_bitblt(virge, -1, 0);
  793. - break;
  794. - case 0xa504:
  795. - virge->s3d.r_width = (val >> 16) & 0x7ff;
  796. - virge->s3d.r_height = val & 0x7ff;
  797. - break;
  798. - case 0xa508:
  799. - virge->s3d.rsrc_x = (val >> 16) & 0x7ff;
  800. - virge->s3d.rsrc_y = val & 0x7ff;
  801. - break;
  802. - case 0xa50c:
  803. - virge->s3d.rdest_x = (val >> 16) & 0x7ff;
  804. - virge->s3d.rdest_y = val & 0x7ff;
  805. - if (virge->s3d.cmd_set & CMD_SET_AE)
  806. - s3_virge_bitblt(virge, -1, 0);
  807. - break;
  808. - case 0xa96c:
  809. - virge->s3d.lxend0 = (val >> 16) & 0x7ff;
  810. - virge->s3d.lxend1 = val & 0x7ff;
  811. - break;
  812. - case 0xa970:
  813. - virge->s3d.ldx = (int32_t)val;
  814. - break;
  815. - case 0xa974:
  816. - virge->s3d.lxstart = val;
  817. - break;
  818. - case 0xa978:
  819. - virge->s3d.lystart = val & 0x7ff;
  820. - break;
  821. - case 0xa97c:
  822. - virge->s3d.lycnt = val & 0x7ff;
  823. - virge->s3d.line_dir = val >> 31;
  824. - if (virge->s3d.cmd_set & CMD_SET_AE)
  825. - s3_virge_bitblt(virge, -1, 0);
  826. - break;
  827. -
  828. - case 0xad00:
  829. - virge->s3d.cmd_set = val;
  830. - if (!(val & CMD_SET_AE))
  831. - s3_virge_bitblt(virge, -1, 0);
  832. - break;
  833. - case 0xad68:
  834. - virge->s3d.prdx = val;
  835. - break;
  836. - case 0xad6c:
  837. - virge->s3d.prxstart = val;
  838. - break;
  839. - case 0xad70:
  840. - virge->s3d.pldx = val;
  841. - break;
  842. - case 0xad74:
  843. - virge->s3d.plxstart = val;
  844. - break;
  845. - case 0xad78:
  846. - virge->s3d.pystart = val & 0x7ff;
  847. - break;
  848. - case 0xad7c:
  849. - virge->s3d.pycnt = val & 0x300007ff;
  850. - if (virge->s3d.cmd_set & CMD_SET_AE)
  851. - s3_virge_bitblt(virge, -1, 0);
  852. - break;
  853. -
  854. - case 0xb4d4:
  855. - virge->s3d_tri.z_base = val & 0x3ffff8;
  856. - break;
  857. - case 0xb4d8:
  858. - virge->s3d_tri.dest_base = val & 0x3ffff8;
  859. - break;
  860. - case 0xb4dc:
  861. - virge->s3d_tri.clip_l = (val >> 16) & 0x7ff;
  862. - virge->s3d_tri.clip_r = val & 0x7ff;
  863. - break;
  864. - case 0xb4e0:
  865. - virge->s3d_tri.clip_t = (val >> 16) & 0x7ff;
  866. - virge->s3d_tri.clip_b = val & 0x7ff;
  867. - break;
  868. - case 0xb4e4:
  869. - virge->s3d_tri.dest_str = (val >> 16) & 0xff8;
  870. - virge->s3d.src_str = val & 0xff8;
  871. - break;
  872. - case 0xb4e8:
  873. - virge->s3d_tri.z_str = val & 0xff8;
  874. - break;
  875. - case 0xb4ec:
  876. - virge->s3d_tri.tex_base = val & 0x3ffff8;
  877. - break;
  878. - case 0xb4f0:
  879. - virge->s3d_tri.tex_bdr_clr = val & 0xffffff;
  880. - break;
  881. - case 0xb500:
  882. - virge->s3d_tri.cmd_set = val;
  883. - if (!(val & CMD_SET_AE))
  884. - queue_triangle(virge);
  885. - break;
  886. - case 0xb504:
  887. - virge->s3d_tri.tbv = val & 0xfffff;
  888. - break;
  889. - case 0xb508:
  890. - virge->s3d_tri.tbu = val & 0xfffff;
  891. - break;
  892. - case 0xb50c:
  893. - virge->s3d_tri.TdWdX = val;
  894. - break;
  895. - case 0xb510:
  896. - virge->s3d_tri.TdWdY = val;
  897. - break;
  898. - case 0xb514:
  899. - virge->s3d_tri.tws = val;
  900. - break;
  901. - case 0xb518:
  902. - virge->s3d_tri.TdDdX = val;
  903. - break;
  904. - case 0xb51c:
  905. - virge->s3d_tri.TdVdX = val;
  906. - break;
  907. - case 0xb520:
  908. - virge->s3d_tri.TdUdX = val;
  909. - break;
  910. - case 0xb524:
  911. - virge->s3d_tri.TdDdY = val;
  912. - break;
  913. - case 0xb528:
  914. - virge->s3d_tri.TdVdY = val;
  915. - break;
  916. - case 0xb52c:
  917. - virge->s3d_tri.TdUdY = val;
  918. - break;
  919. - case 0xb530:
  920. - virge->s3d_tri.tds = val;
  921. - break;
  922. - case 0xb534:
  923. - virge->s3d_tri.tvs = val;
  924. - break;
  925. - case 0xb538:
  926. - virge->s3d_tri.tus = val;
  927. - break;
  928. - case 0xb53c:
  929. - virge->s3d_tri.TdGdX = val >> 16;
  930. - virge->s3d_tri.TdBdX = val & 0xffff;
  931. - break;
  932. - case 0xb540:
  933. - virge->s3d_tri.TdAdX = val >> 16;
  934. - virge->s3d_tri.TdRdX = val & 0xffff;
  935. - break;
  936. - case 0xb544:
  937. - virge->s3d_tri.TdGdY = val >> 16;
  938. - virge->s3d_tri.TdBdY = val & 0xffff;
  939. - break;
  940. - case 0xb548:
  941. - virge->s3d_tri.TdAdY = val >> 16;
  942. - virge->s3d_tri.TdRdY = val & 0xffff;
  943. - break;
  944. - case 0xb54c:
  945. - virge->s3d_tri.tgs = (val >> 16) & 0xffff;
  946. - virge->s3d_tri.tbs = val & 0xffff;
  947. - break;
  948. - case 0xb550:
  949. - virge->s3d_tri.tas = (val >> 16) & 0xffff;
  950. - virge->s3d_tri.trs = val & 0xffff;
  951. - break;
  952. -
  953. - case 0xb554:
  954. - virge->s3d_tri.TdZdX = val;
  955. - break;
  956. - case 0xb558:
  957. - virge->s3d_tri.TdZdY = val;
  958. - break;
  959. - case 0xb55c:
  960. - virge->s3d_tri.tzs = val;
  961. - break;
  962. - case 0xb560:
  963. - virge->s3d_tri.TdXdY12 = val;
  964. - break;
  965. - case 0xb564:
  966. - virge->s3d_tri.txend12 = val;
  967. - break;
  968. - case 0xb568:
  969. - virge->s3d_tri.TdXdY01 = val;
  970. - break;
  971. - case 0xb56c:
  972. - virge->s3d_tri.txend01 = val;
  973. - break;
  974. - case 0xb570:
  975. - virge->s3d_tri.TdXdY02 = val;
  976. - break;
  977. - case 0xb574:
  978. - virge->s3d_tri.txs = val;
  979. - break;
  980. - case 0xb578:
  981. - virge->s3d_tri.tys = val;
  982. - break;
  983. - case 0xb57c:
  984. - virge->s3d_tri.ty01 = (val >> 16) & 0x7ff;
  985. - virge->s3d_tri.ty12 = val & 0x7ff;
  986. - virge->s3d_tri.tlr = val >> 31;
  987. - if (virge->s3d_tri.cmd_set & CMD_SET_AE)
  988. - queue_triangle(virge);
  989. - break;
  990. - }
  991. - }
  992. + case 0xa4d4: case 0xa8d4:
  993. + virge->s3d.src_base = val & 0x3ffff8;
  994. + break;
  995. + case 0xa4d8: case 0xa8d8:
  996. + virge->s3d.dest_base = val & 0x3ffff8;
  997. + break;
  998. + case 0xa4dc: case 0xa8dc:
  999. + virge->s3d.clip_l = (val >> 16) & 0x7ff;
  1000. + virge->s3d.clip_r = val & 0x7ff;
  1001. + break;
  1002. + case 0xa4e0: case 0xa8e0:
  1003. + virge->s3d.clip_t = (val >> 16) & 0x7ff;
  1004. + virge->s3d.clip_b = val & 0x7ff;
  1005. + break;
  1006. + case 0xa4e4: case 0xa8e4:
  1007. + virge->s3d.dest_str = (val >> 16) & 0xff8;
  1008. + virge->s3d.src_str = val & 0xff8;
  1009. + break;
  1010. + case 0xa4e8: case 0xace8:
  1011. + virge->s3d.mono_pat_0 = val;
  1012. + break;
  1013. + case 0xa4ec: case 0xacec:
  1014. + virge->s3d.mono_pat_1 = val;
  1015. + break;
  1016. + case 0xa4f0: case 0xacf0:
  1017. + virge->s3d.pat_bg_clr = val;
  1018. + break;
  1019. + case 0xa4f4: case 0xa8f4: case 0xacf4:
  1020. + virge->s3d.pat_fg_clr = val;
  1021. + break;
  1022. + case 0xa4f8:
  1023. + virge->s3d.src_bg_clr = val;
  1024. + break;
  1025. + case 0xa4fc:
  1026. + virge->s3d.src_fg_clr = val;
  1027. + break;
  1028. + case 0xa500: case 0xa900:
  1029. + virge->s3d.cmd_set = val;
  1030. + if (!(val & CMD_SET_AE))
  1031. + s3_virge_bitblt(virge, -1, 0);
  1032. + break;
  1033. + case 0xa504:
  1034. + virge->s3d.r_width = (val >> 16) & 0x7ff;
  1035. + virge->s3d.r_height = val & 0x7ff;
  1036. + break;
  1037. + case 0xa508:
  1038. + virge->s3d.rsrc_x = (val >> 16) & 0x7ff;
  1039. + virge->s3d.rsrc_y = val & 0x7ff;
  1040. + break;
  1041. + case 0xa50c:
  1042. + virge->s3d.rdest_x = (val >> 16) & 0x7ff;
  1043. + virge->s3d.rdest_y = val & 0x7ff;
  1044. + if (virge->s3d.cmd_set & CMD_SET_AE)
  1045. + s3_virge_bitblt(virge, -1, 0);
  1046. + break;
  1047. + case 0xa96c:
  1048. + virge->s3d.lxend0 = (val >> 16) & 0x7ff;
  1049. + virge->s3d.lxend1 = val & 0x7ff;
  1050. + break;
  1051. + case 0xa970:
  1052. + virge->s3d.ldx = (int32_t)val;
  1053. + break;
  1054. + case 0xa974:
  1055. + virge->s3d.lxstart = val;
  1056. + break;
  1057. + case 0xa978:
  1058. + virge->s3d.lystart = val & 0x7ff;
  1059. + break;
  1060. + case 0xa97c:
  1061. + virge->s3d.lycnt = val & 0x7ff;
  1062. + virge->s3d.line_dir = val >> 31;
  1063. + if (virge->s3d.cmd_set & CMD_SET_AE)
  1064. + s3_virge_bitblt(virge, -1, 0);
  1065. break;
  1066. - }
  1067. -
  1068. - virge->fifo_read_idx++;
  1069. - fifo->addr_type = FIFO_INVALID;
  1070. -
  1071. - if (FIFO_ENTRIES > 0xe000)
  1072. - thread_set_event(virge->fifo_not_full_event);
  1073.  
  1074. - end_time = timer_read();
  1075. - virge_time += end_time - start_time;
  1076. - }
  1077. - virge->virge_busy = 0;
  1078. - virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP;
  1079. - s3_virge_update_irqs(virge);
  1080. - }
  1081. -}
  1082. + case 0xad00:
  1083. + virge->s3d.cmd_set = val;
  1084. + if (!(val & CMD_SET_AE))
  1085. + s3_virge_bitblt(virge, -1, 0);
  1086. + break;
  1087. + case 0xad68:
  1088. + virge->s3d.prdx = val;
  1089. + break;
  1090. + case 0xad6c:
  1091. + virge->s3d.prxstart = val;
  1092. + break;
  1093. + case 0xad70:
  1094. + virge->s3d.pldx = val;
  1095. + break;
  1096. + case 0xad74:
  1097. + virge->s3d.plxstart = val;
  1098. + break;
  1099. + case 0xad78:
  1100. + virge->s3d.pystart = val & 0x7ff;
  1101. + break;
  1102. + case 0xad7c:
  1103. + virge->s3d.pycnt = val & 0x300007ff;
  1104. + if (virge->s3d.cmd_set & CMD_SET_AE)
  1105. + s3_virge_bitblt(virge, -1, 0);
  1106. + break;
  1107.  
  1108. -static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type)
  1109. -{
  1110. - fifo_entry_t *fifo = &virge->fifo[virge->fifo_write_idx & FIFO_MASK];
  1111. + case 0xb4d4:
  1112. + virge->s3d_tri.z_base = val & 0x3ffff8;
  1113. + break;
  1114. + case 0xb4d8:
  1115. + virge->s3d_tri.dest_base = val & 0x3ffff8;
  1116. + break;
  1117. + case 0xb4dc:
  1118. + virge->s3d_tri.clip_l = (val >> 16) & 0x7ff;
  1119. + virge->s3d_tri.clip_r = val & 0x7ff;
  1120. + break;
  1121. + case 0xb4e0:
  1122. + virge->s3d_tri.clip_t = (val >> 16) & 0x7ff;
  1123. + virge->s3d_tri.clip_b = val & 0x7ff;
  1124. + break;
  1125. + case 0xb4e4:
  1126. + virge->s3d_tri.dest_str = (val >> 16) & 0xff8;
  1127. + virge->s3d.src_str = val & 0xff8;
  1128. + break;
  1129. + case 0xb4e8:
  1130. + virge->s3d_tri.z_str = val & 0xff8;
  1131. + break;
  1132. + case 0xb4ec:
  1133. + virge->s3d_tri.tex_base = val & 0x3ffff8;
  1134. + break;
  1135. + case 0xb4f0:
  1136. + virge->s3d_tri.tex_bdr_clr = val & 0xffffff;
  1137. + break;
  1138. + case 0xb500:
  1139. + virge->s3d_tri.cmd_set = val;
  1140. + if (!(val & CMD_SET_AE))
  1141. + queue_triangle(virge);
  1142. + break;
  1143. + case 0xb504:
  1144. + virge->s3d_tri.tbv = val & 0xfffff;
  1145. + break;
  1146. + case 0xb508:
  1147. + virge->s3d_tri.tbu = val & 0xfffff;
  1148. + break;
  1149. + case 0xb50c:
  1150. + virge->s3d_tri.TdWdX = val;
  1151. + break;
  1152. + case 0xb510:
  1153. + virge->s3d_tri.TdWdY = val;
  1154. + break;
  1155. + case 0xb514:
  1156. + virge->s3d_tri.tws = val;
  1157. + break;
  1158. + case 0xb518:
  1159. + virge->s3d_tri.TdDdX = val;
  1160. + break;
  1161. + case 0xb51c:
  1162. + virge->s3d_tri.TdVdX = val;
  1163. + break;
  1164. + case 0xb520:
  1165. + virge->s3d_tri.TdUdX = val;
  1166. + break;
  1167. + case 0xb524:
  1168. + virge->s3d_tri.TdDdY = val;
  1169. + break;
  1170. + case 0xb528:
  1171. + virge->s3d_tri.TdVdY = val;
  1172. + break;
  1173. + case 0xb52c:
  1174. + virge->s3d_tri.TdUdY = val;
  1175. + break;
  1176. + case 0xb530:
  1177. + virge->s3d_tri.tds = val;
  1178. + break;
  1179. + case 0xb534:
  1180. + virge->s3d_tri.tvs = val;
  1181. + break;
  1182. + case 0xb538:
  1183. + virge->s3d_tri.tus = val;
  1184. + break;
  1185. + case 0xb53c:
  1186. + virge->s3d_tri.TdGdX = val >> 16;
  1187. + virge->s3d_tri.TdBdX = val & 0xffff;
  1188. + break;
  1189. + case 0xb540:
  1190. + virge->s3d_tri.TdAdX = val >> 16;
  1191. + virge->s3d_tri.TdRdX = val & 0xffff;
  1192. + break;
  1193. + case 0xb544:
  1194. + virge->s3d_tri.TdGdY = val >> 16;
  1195. + virge->s3d_tri.TdBdY = val & 0xffff;
  1196. + break;
  1197. + case 0xb548:
  1198. + virge->s3d_tri.TdAdY = val >> 16;
  1199. + virge->s3d_tri.TdRdY = val & 0xffff;
  1200. + break;
  1201. + case 0xb54c:
  1202. + virge->s3d_tri.tgs = (val >> 16) & 0xffff;
  1203. + virge->s3d_tri.tbs = val & 0xffff;
  1204. + break;
  1205. + case 0xb550:
  1206. + virge->s3d_tri.tas = (val >> 16) & 0xffff;
  1207. + virge->s3d_tri.trs = val & 0xffff;
  1208. + break;
  1209.  
  1210. - if (FIFO_FULL)
  1211. - {
  1212. - thread_reset_event(virge->fifo_not_full_event);
  1213. - if (FIFO_FULL)
  1214. - {
  1215. - thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/
  1216. + case 0xb554:
  1217. + virge->s3d_tri.TdZdX = val;
  1218. + break;
  1219. + case 0xb558:
  1220. + virge->s3d_tri.TdZdY = val;
  1221. + break;
  1222. + case 0xb55c:
  1223. + virge->s3d_tri.tzs = val;
  1224. + break;
  1225. + case 0xb560:
  1226. + virge->s3d_tri.TdXdY12 = val;
  1227. + break;
  1228. + case 0xb564:
  1229. + virge->s3d_tri.txend12 = val;
  1230. + break;
  1231. + case 0xb568:
  1232. + virge->s3d_tri.TdXdY01 = val;
  1233. + break;
  1234. + case 0xb56c:
  1235. + virge->s3d_tri.txend01 = val;
  1236. + break;
  1237. + case 0xb570:
  1238. + virge->s3d_tri.TdXdY02 = val;
  1239. + break;
  1240. + case 0xb574:
  1241. + virge->s3d_tri.txs = val;
  1242. + break;
  1243. + case 0xb578:
  1244. + virge->s3d_tri.tys = val;
  1245. + break;
  1246. + case 0xb57c:
  1247. + virge->s3d_tri.ty01 = (val >> 16) & 0x7ff;
  1248. + virge->s3d_tri.ty12 = val & 0x7ff;
  1249. + virge->s3d_tri.tlr = val >> 31;
  1250. + if (virge->s3d_tri.cmd_set & CMD_SET_AE)
  1251. + queue_triangle(virge);
  1252. + break;
  1253. + }
  1254. }
  1255. + break;
  1256. }
  1257.  
  1258. - fifo->val = val;
  1259. - fifo->addr_type = (addr & FIFO_ADDR) | type;
  1260. + end_time = timer_read();
  1261. + virge_time += end_time - start_time;
  1262.  
  1263. - virge->fifo_write_idx++;
  1264. -
  1265. - if (FIFO_ENTRIES > 0xe000)
  1266. - wake_fifo_thread(virge);
  1267. - if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8)
  1268. - wake_fifo_thread(virge);
  1269. + virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP;
  1270. + s3_virge_update_irqs(virge);
  1271. }
  1272.  
  1273. static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *p)
  1274. {
  1275. virge_t *virge = (virge_t *)p;
  1276. -
  1277. +
  1278. // pclog("New MMIO writeb %08X %02X %04x(%08x):%08x\n", addr, val, CS, cs, pc);
  1279. - reg_writes++;
  1280. + reg_writes++;
  1281. if ((addr & 0xfffc) < 0x8000)
  1282. {
  1283. s3_virge_queue(virge, addr, val, FIFO_WRITE_BYTE);
  1284. @@ -1357,7 +1238,7 @@ static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *p)
  1285. break;
  1286. }
  1287.  
  1288. -
  1289. +
  1290. }
  1291. static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *p)
  1292. {
  1293. @@ -1367,7 +1248,7 @@ static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *p)
  1294. if ((addr & 0xfffc) < 0x8000)
  1295. {
  1296. s3_virge_queue(virge, addr, val, FIFO_WRITE_WORD);
  1297. - }
  1298. + }
  1299. else switch (addr & 0xfffe)
  1300. {
  1301. case 0x83d4:
  1302. @@ -1486,38 +1367,38 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
  1303. case 0x81f0:
  1304. virge->streams.pri_start = val;
  1305. virge->streams.pri_x = (val >> 16) & 0x7ff;
  1306. - virge->streams.pri_y = val & 0x7ff;
  1307. + virge->streams.pri_y = val & 0x7ff;
  1308. svga_recalctimings(svga);
  1309. svga->fullchange = changeframecount;
  1310. break;
  1311. case 0x81f4:
  1312. virge->streams.pri_size = val;
  1313. virge->streams.pri_w = (val >> 16) & 0x7ff;
  1314. - virge->streams.pri_h = val & 0x7ff;
  1315. + virge->streams.pri_h = val & 0x7ff;
  1316. svga_recalctimings(svga);
  1317. svga->fullchange = changeframecount;
  1318. break;
  1319. case 0x81f8:
  1320. virge->streams.sec_start = val;
  1321. virge->streams.sec_x = (val >> 16) & 0x7ff;
  1322. - virge->streams.sec_y = val & 0x7ff;
  1323. + virge->streams.sec_y = val & 0x7ff;
  1324. svga_recalctimings(svga);
  1325. svga->fullchange = changeframecount;
  1326. break;
  1327. case 0x81fc:
  1328. virge->streams.sec_size = val;
  1329. virge->streams.sec_w = (val >> 16) & 0x7ff;
  1330. - virge->streams.sec_h = val & 0x7ff;
  1331. + virge->streams.sec_h = val & 0x7ff;
  1332. svga_recalctimings(svga);
  1333. svga->fullchange = changeframecount;
  1334. break;
  1335. -
  1336. +
  1337. case 0x8504:
  1338. virge->subsys_stat &= ~(val & 0xff);
  1339. virge->subsys_cntl = (val >> 8);
  1340. s3_virge_update_irqs(virge);
  1341. break;
  1342. -
  1343. +
  1344. case 0xa000: case 0xa004: case 0xa008: case 0xa00c:
  1345. case 0xa010: case 0xa014: case 0xa018: case 0xa01c:
  1346. case 0xa020: case 0xa024: case 0xa028: case 0xa02c:
  1347. @@ -1557,7 +1438,7 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
  1348. virge->s3d.pattern_8[y*8 + x + 1] = val >> 8;
  1349. virge->s3d.pattern_8[y*8 + x + 2] = val >> 16;
  1350. virge->s3d.pattern_8[y*8 + x + 3] = val >> 24;
  1351. -
  1352. +
  1353. x = (addr >> 1) & 6;
  1354. y = (addr >> 4) & 7;
  1355. virge->s3d.pattern_16[y*8 + x] = val & 0xffff;
  1356. @@ -1669,7 +1550,7 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
  1357. if (virge->s3d.cmd_set & CMD_SET_AE)
  1358. s3_virge_bitblt(virge, -1, 0);
  1359. break;
  1360. -
  1361. +
  1362. case 0xb4d4:
  1363. virge->s3d_tri.z_base = val & 0x3ffff8;
  1364. break;
  1365. @@ -1701,11 +1582,6 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
  1366. virge->s3d_tri.cmd_set = val;
  1367. if (!(val & CMD_SET_AE))
  1368. queue_triangle(virge);
  1369. -/* {
  1370. - thread_set_event(virge->wake_render_thread);
  1371. - thread_wait_event(virge->wake_main_thread, -1);
  1372. - } */
  1373. -// s3_virge_triangle(virge);
  1374. break;
  1375. case 0xb504:
  1376. virge->s3d_tri.tbv = val & 0xfffff;
  1377. @@ -1773,7 +1649,7 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
  1378. virge->s3d_tri.tas = (val >> 16) & 0xffff;
  1379. virge->s3d_tri.trs = val & 0xffff;
  1380. break;
  1381. -
  1382. +
  1383. case 0xb554:
  1384. virge->s3d_tri.TdZdX = val;
  1385. break;
  1386. @@ -1810,12 +1686,6 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
  1387. virge->s3d_tri.tlr = val >> 31;
  1388. if (virge->s3d_tri.cmd_set & CMD_SET_AE)
  1389. queue_triangle(virge);
  1390. -/* {
  1391. - thread_set_event(virge->wake_render_thread);
  1392. - thread_wait_event(virge->wake_main_thread, -1);
  1393. - }*/
  1394. -
  1395. -// s3_virge_triangle(virge);
  1396. break;
  1397. }
  1398. }
  1399. @@ -1879,7 +1749,7 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
  1400. case 7: update = 1; Zzb = Zs; break; \
  1401. } \
  1402. } while (0)
  1403. -
  1404. +
  1405. #define MIX() \
  1406. do \
  1407. { \
  1408. @@ -1927,7 +1797,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1409. int cpu_dat_shift;
  1410. uint32_t *pattern_data;
  1411. uint32_t src_fg_clr, src_bg_clr;
  1412. -
  1413. +
  1414. switch (virge->s3d.cmd_set & CMD_SET_FORMAT_MASK)
  1415. {
  1416. case CMD_SET_FORMAT_8:
  1417. @@ -1958,7 +1828,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1418. }
  1419. if (virge->s3d.cmd_set & CMD_SET_MP)
  1420. pattern_data = mono_pattern;
  1421. -
  1422. +
  1423. switch (virge->s3d.cmd_set & CMD_SET_ITA_MASK)
  1424. {
  1425. case CMD_SET_ITA_BYTE:
  1426. @@ -1994,7 +1864,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1427. {
  1428. case CMD_SET_COMMAND_NOP:
  1429. break;
  1430. -
  1431. +
  1432. case CMD_SET_COMMAND_BITBLT:
  1433. if (count == -1)
  1434. {
  1435. @@ -2006,7 +1876,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1436. virge->s3d.h = virge->s3d.r_height;
  1437. virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff;
  1438. virge->s3d.data_left_count = 0;
  1439. -
  1440. +
  1441. /* pclog("BitBlt start %i,%i %i,%i %i,%i %02X %x %x\n",
  1442. virge->s3d.src_x,
  1443. virge->s3d.src_y,
  1444. @@ -2017,7 +1887,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1445. virge->s3d.rop,
  1446. virge->s3d.src_base,
  1447. virge->s3d.dest_base);*/
  1448. -
  1449. +
  1450. if (virge->s3d.cmd_set & CMD_SET_IDS)
  1451. return;
  1452. }
  1453. @@ -2089,7 +1959,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1454.  
  1455. WRITE(dest_addr, out);
  1456. }
  1457. -
  1458. +
  1459. virge->s3d.src_x += x_inc;
  1460. virge->s3d.src_x &= 0x7ff;
  1461. virge->s3d.dest_x += x_inc;
  1462. @@ -2103,7 +1973,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1463. virge->s3d.src_y += y_inc;
  1464. virge->s3d.dest_y += y_inc;
  1465. virge->s3d.h--;
  1466. -
  1467. +
  1468. switch (virge->s3d.cmd_set & (CMD_SET_MS | CMD_SET_IDS))
  1469. {
  1470. case CMD_SET_IDS:
  1471. @@ -2123,10 +1993,10 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1472. }
  1473. }
  1474. else
  1475. - virge->s3d.w--;
  1476. + virge->s3d.w--;
  1477. }
  1478. break;
  1479. -
  1480. +
  1481. case CMD_SET_COMMAND_RECTFILL:
  1482. /*No source, pattern = pat_fg_clr*/
  1483. if (count == -1)
  1484. @@ -2138,7 +2008,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1485. virge->s3d.w = virge->s3d.r_width;
  1486. virge->s3d.h = virge->s3d.r_height;
  1487. virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff;
  1488. -
  1489. +
  1490. /* pclog("RctFll start %i,%i %i,%i %02X %08x\n", virge->s3d.dest_x,
  1491. virge->s3d.dest_y,
  1492. virge->s3d.w,
  1493. @@ -2183,11 +2053,11 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1494. }
  1495. }
  1496. else
  1497. - virge->s3d.w--;
  1498. + virge->s3d.w--;
  1499. count--;
  1500. }
  1501. break;
  1502. -
  1503. +
  1504. case CMD_SET_COMMAND_LINE:
  1505. if (count == -1)
  1506. {
  1507. @@ -2201,7 +2071,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1508. int x;
  1509. int new_x;
  1510. int first_pixel = 1;
  1511. -
  1512. +
  1513. x = virge->s3d.dest_x >> 20;
  1514.  
  1515. if (virge->s3d.h == virge->s3d.lycnt &&
  1516. @@ -2214,11 +2084,11 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1517. else
  1518. new_x = (virge->s3d.dest_x + virge->s3d.ldx) >> 20;
  1519.  
  1520. -
  1521. +
  1522. if ((virge->s3d.line_dir && x > new_x) ||
  1523. (!virge->s3d.line_dir && x < new_x))
  1524. goto skip_line;
  1525. -
  1526. +
  1527. do
  1528. {
  1529. uint32_t dest_addr = virge->s3d.dest_base + (x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str);
  1530. @@ -2247,7 +2117,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
  1531.  
  1532. WRITE(dest_addr, out);
  1533. }
  1534. -
  1535. +
  1536. if (x < new_x)
  1537. x++;
  1538. else if (x > new_x)
  1539. @@ -2295,7 +2165,7 @@ skip_line:
  1540.  
  1541. WRITE(dest_addr, out);
  1542. }
  1543. -
  1544. +
  1545. x = (x + xdir) & 0x7ff;
  1546. }
  1547. while (x != (xend + xdir));
  1548. @@ -2344,21 +2214,21 @@ typedef struct s3d_state_t
  1549. int32_t r, g, b, a, u, v, d, w;
  1550.  
  1551. int32_t base_r, base_g, base_b, base_a, base_u, base_v, base_d, base_w;
  1552. -
  1553. +
  1554. uint32_t base_z;
  1555.  
  1556. uint32_t tbu, tbv;
  1557.  
  1558. uint32_t cmd_set;
  1559. int max_d;
  1560. -
  1561. +
  1562. uint16_t *texture[10];
  1563. -
  1564. +
  1565. uint32_t tex_bdr_clr;
  1566. -
  1567. +
  1568. int32_t x1, x2;
  1569. int y;
  1570. -
  1571. +
  1572. rgba_t dest_rgba;
  1573. } s3d_state_t;
  1574.  
  1575. @@ -2366,7 +2236,7 @@ typedef struct s3d_texture_state_t
  1576. {
  1577. int level;
  1578. int texture_shift;
  1579. -
  1580. +
  1581. int32_t u, v;
  1582. } s3d_texture_state_t;
  1583.  
  1584. @@ -2462,7 +2332,7 @@ static void tex_ARGB8888_nowrap(s3d_state_t *state, s3d_texture_state_t *texture
  1585. static void tex_sample_normal(s3d_state_t *state)
  1586. {
  1587. s3d_texture_state_t texture_state;
  1588. -
  1589. +
  1590. texture_state.level = state->max_d;
  1591. texture_state.texture_shift = 18 + (9 - texture_state.level);
  1592. texture_state.u = state->u + state->tbu;
  1593. @@ -2500,12 +2370,12 @@ static void tex_sample_normal_filter(s3d_state_t *state)
  1594. texture_state.u = state->u + state->tbu + tex_offset;
  1595. texture_state.v = state->v + state->tbv + tex_offset;
  1596. tex_read(state, &texture_state, &tex_samples[3]);
  1597. -
  1598. +
  1599. d[0] = (256 - du) * (256 - dv);
  1600. d[1] = du * (256 - dv);
  1601. d[2] = (256 - du) * dv;
  1602. d[3] = du * dv;
  1603. -
  1604. +
  1605. state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16;
  1606. state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16;
  1607. state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16;
  1608. @@ -2539,7 +2409,7 @@ static void tex_sample_mipmap_filter(s3d_state_t *state)
  1609. texture_state.level = 0;
  1610. texture_state.texture_shift = 18 + (9 - texture_state.level);
  1611. tex_offset = 1 << texture_state.texture_shift;
  1612. -
  1613. +
  1614. texture_state.u = state->u + state->tbu;
  1615. texture_state.v = state->v + state->tbv;
  1616. tex_read(state, &texture_state, &tex_samples[0]);
  1617. @@ -2562,7 +2432,7 @@ static void tex_sample_mipmap_filter(s3d_state_t *state)
  1618. d[1] = du * (256 - dv);
  1619. d[2] = (256 - du) * dv;
  1620. d[3] = du * dv;
  1621. -
  1622. +
  1623. state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16;
  1624. state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16;
  1625. state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16;
  1626. @@ -2576,9 +2446,9 @@ static void tex_sample_persp_normal(s3d_state_t *state)
  1627.  
  1628. if (state->w)
  1629. w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w);
  1630. -
  1631. +
  1632. texture_state.level = state->max_d;
  1633. - texture_state.texture_shift = 18 + (9 - texture_state.level);
  1634. + texture_state.texture_shift = 18 + (9 - texture_state.level);
  1635. texture_state.u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (12 + state->max_d)) + state->tbu;
  1636. texture_state.v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (12 + state->max_d)) + state->tbv;
  1637.  
  1638. @@ -2603,7 +2473,7 @@ static void tex_sample_persp_normal_filter(s3d_state_t *state)
  1639. texture_state.level = state->max_d;
  1640. texture_state.texture_shift = 18 + (9 - texture_state.level);
  1641. tex_offset = 1 << texture_state.texture_shift;
  1642. -
  1643. +
  1644. texture_state.u = u;
  1645. texture_state.v = v;
  1646. tex_read(state, &texture_state, &tex_samples[0]);
  1647. @@ -2626,7 +2496,7 @@ static void tex_sample_persp_normal_filter(s3d_state_t *state)
  1648. d[1] = du * (256 - dv);
  1649. d[2] = (256 - du) * dv;
  1650. d[3] = du * dv;
  1651. -
  1652. +
  1653. state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16;
  1654. state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16;
  1655. state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16;
  1656. @@ -2640,9 +2510,9 @@ static void tex_sample_persp_normal_375(s3d_state_t *state)
  1657.  
  1658. if (state->w)
  1659. w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w);
  1660. -
  1661. +
  1662. texture_state.level = state->max_d;
  1663. - texture_state.texture_shift = 18 + (9 - texture_state.level);
  1664. + texture_state.texture_shift = 18 + (9 - texture_state.level);
  1665. texture_state.u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (8 + state->max_d)) + state->tbu;
  1666. texture_state.v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (8 + state->max_d)) + state->tbv;
  1667.  
  1668. @@ -2663,7 +2533,7 @@ static void tex_sample_persp_normal_filter_375(s3d_state_t *state)
  1669.  
  1670. u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (8 + state->max_d)) + state->tbu;
  1671. v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (8 + state->max_d)) + state->tbv;
  1672. -
  1673. +
  1674. texture_state.level = state->max_d;
  1675. texture_state.texture_shift = 18 + (9 - texture_state.level);
  1676. tex_offset = 1 << texture_state.texture_shift;
  1677. @@ -2690,7 +2560,7 @@ static void tex_sample_persp_normal_filter_375(s3d_state_t *state)
  1678. d[1] = du * (256 - dv);
  1679. d[2] = (256 - du) * dv;
  1680. d[3] = du * dv;
  1681. -
  1682. +
  1683. state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16;
  1684. state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16;
  1685. state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16;
  1686. @@ -2705,7 +2575,7 @@ static void tex_sample_persp_mipmap(s3d_state_t *state)
  1687.  
  1688. if (state->w)
  1689. w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w);
  1690. -
  1691. +
  1692. texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf);
  1693. if (texture_state.level < 0)
  1694. texture_state.level = 0;
  1695. @@ -2730,7 +2600,7 @@ static void tex_sample_persp_mipmap_filter(s3d_state_t *state)
  1696.  
  1697. u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (12 + state->max_d)) + state->tbu;
  1698. v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (12 + state->max_d)) + state->tbv;
  1699. -
  1700. +
  1701. texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf);
  1702. if (texture_state.level < 0)
  1703. texture_state.level = 0;
  1704. @@ -2759,7 +2629,7 @@ static void tex_sample_persp_mipmap_filter(s3d_state_t *state)
  1705. d[1] = du * (256 - dv);
  1706. d[2] = (256 - du) * dv;
  1707. d[3] = du * dv;
  1708. -
  1709. +
  1710. state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16;
  1711. state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16;
  1712. state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16;
  1713. @@ -2773,7 +2643,7 @@ static void tex_sample_persp_mipmap_375(s3d_state_t *state)
  1714.  
  1715. if (state->w)
  1716. w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w);
  1717. -
  1718. +
  1719. texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf);
  1720. if (texture_state.level < 0)
  1721. texture_state.level = 0;
  1722. @@ -2798,13 +2668,13 @@ static void tex_sample_persp_mipmap_filter_375(s3d_state_t *state)
  1723.  
  1724. u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (8 + state->max_d)) + state->tbu;
  1725. v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (8 + state->max_d)) + state->tbv;
  1726. -
  1727. +
  1728. texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf);
  1729. if (texture_state.level < 0)
  1730. texture_state.level = 0;
  1731. texture_state.texture_shift = 18 + (9 - texture_state.level);
  1732. tex_offset = 1 << texture_state.texture_shift;
  1733. -
  1734. +
  1735. texture_state.u = u;
  1736. texture_state.v = v;
  1737. tex_read(state, &texture_state, &tex_samples[0]);
  1738. @@ -2827,7 +2697,7 @@ static void tex_sample_persp_mipmap_filter_375(s3d_state_t *state)
  1739. d[1] = du * (256 - dv);
  1740. d[2] = (256 - du) * dv;
  1741. d[3] = du * dv;
  1742. -
  1743. +
  1744. state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16;
  1745. state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16;
  1746. state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16;
  1747. @@ -2851,7 +2721,7 @@ static void tex_sample_persp_mipmap_filter_375(s3d_state_t *state)
  1748. b = ((b) < 0) ? 0 : 0xff; \
  1749. if ((a) & ~0xff) \
  1750. a = ((a) < 0) ? 0 : 0xff;
  1751. -
  1752. +
  1753. #define CLAMP_RGB(r, g, b) do \
  1754. { \
  1755. if ((r) < 0) \
  1756. @@ -2916,11 +2786,11 @@ static void dest_pixel_lit_texture_reflection(s3d_state_t *state)
  1757. static void dest_pixel_lit_texture_modulate(s3d_state_t *state)
  1758. {
  1759. int r = state->r >> 7, g = state->g >> 7, b = state->b >> 7, a = state->a >> 7;
  1760. -
  1761. +
  1762. tex_sample(state);
  1763. -
  1764. +
  1765. CLAMP_RGBA(r, g, b, a);
  1766. -
  1767. +
  1768. state->dest_rgba.r = ((state->dest_rgba.r) * r) >> 8;
  1769. state->dest_rgba.g = ((state->dest_rgba.g) * g) >> 8;
  1770. state->dest_rgba.b = ((state->dest_rgba.b) * b) >> 8;
  1771. @@ -2935,13 +2805,13 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1772. uint8_t *vram = virge->svga.vram;
  1773.  
  1774. int x_dir = s3d_tri->tlr ? 1 : -1;
  1775. -
  1776. +
  1777. int use_z = !(s3d_tri->cmd_set & CMD_SET_ZB_MODE);
  1778.  
  1779. int y_count = yc;
  1780. -
  1781. +
  1782. int bpp = (s3d_tri->cmd_set >> 2) & 7;
  1783. -
  1784. +
  1785. uint32_t dest_offset, z_offset;
  1786.  
  1787. dest_offset = s3d_tri->dest_base + (state->y * s3d_tri->dest_str);
  1788. @@ -2954,10 +2824,10 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1789. if (state->y > s3d_tri->clip_b)
  1790. {
  1791. int diff_y = state->y - s3d_tri->clip_b;
  1792. -
  1793. +
  1794. if (diff_y > y_count)
  1795. diff_y = y_count;
  1796. -
  1797. +
  1798. state->base_u += (s3d_tri->TdUdY * diff_y);
  1799. state->base_v += (s3d_tri->TdVdY * diff_y);
  1800. state->base_z += (s3d_tri->TdZdY * diff_y);
  1801. @@ -2977,7 +2847,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1802. if ((state->y - y_count) < s3d_tri->clip_t)
  1803. y_count = state->y - s3d_tri->clip_t;
  1804. }
  1805. -
  1806. +
  1807. for (; y_count > 0; y_count--)
  1808. {
  1809. int x = (state->x1 + ((1 << 20) - 1)) >> 20;
  1810. @@ -3022,7 +2892,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1811. if (x < s3d_tri->clip_l)
  1812. {
  1813. int diff_x = s3d_tri->clip_l - x;
  1814. -
  1815. +
  1816. z += (s3d_tri->TdZdX * diff_x);
  1817. state->u += (s3d_tri->TdUdX * diff_x);
  1818. state->v += (s3d_tri->TdVdX * diff_x);
  1819. @@ -3032,7 +2902,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1820. state->a += (s3d_tri->TdAdX * diff_x);
  1821. state->d += (s3d_tri->TdDdX * diff_x);
  1822. state->w += (s3d_tri->TdWdX * diff_x);
  1823. -
  1824. +
  1825. x = s3d_tri->clip_l;
  1826. }
  1827. }
  1828. @@ -3047,7 +2917,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1829. if (x > s3d_tri->clip_r)
  1830. {
  1831. int diff_x = x - s3d_tri->clip_r;
  1832. -
  1833. +
  1834. z += (s3d_tri->TdZdX * diff_x);
  1835. state->u += (s3d_tri->TdUdX * diff_x);
  1836. state->v += (s3d_tri->TdVdX * diff_x);
  1837. @@ -3057,7 +2927,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1838. state->a += (s3d_tri->TdAdX * diff_x);
  1839. state->d += (s3d_tri->TdDdX * diff_x);
  1840. state->w += (s3d_tri->TdWdX * diff_x);
  1841. -
  1842. +
  1843. x = s3d_tri->clip_r;
  1844. }
  1845. }
  1846. @@ -3090,7 +2960,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1847. {
  1848. uint32_t src_col;
  1849. int src_r = 0, src_g = 0, src_b = 0;
  1850. -
  1851. +
  1852. switch (bpp)
  1853. {
  1854. case 0: /*8 bpp*/
  1855. @@ -3113,7 +2983,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
  1856.  
  1857. switch (bpp)
  1858. {
  1859. - case 0: /*8 bpp*/
  1860. + case 0: /*8 bpp*/
  1861. /*Not implemented yet*/
  1862. break;
  1863. case 1: /*16 bpp*/
  1864. @@ -3188,11 +3058,11 @@ static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri)
  1865.  
  1866. state.tbu = s3d_tri->tbu << 11;
  1867. state.tbv = s3d_tri->tbv << 11;
  1868. -
  1869. +
  1870. state.max_d = (s3d_tri->cmd_set >> 8) & 15;
  1871. -
  1872. +
  1873. state.tex_bdr_clr = s3d_tri->tex_bdr_clr;
  1874. -
  1875. +
  1876. state.cmd_set = s3d_tri->cmd_set;
  1877.  
  1878. state.base_u = s3d_tri->tus;
  1879. @@ -3204,7 +3074,7 @@ static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri)
  1880. state.base_a = (int32_t)s3d_tri->tas;
  1881. state.base_d = s3d_tri->tds;
  1882. state.base_w = s3d_tri->tws;
  1883. -
  1884. +
  1885. tex_base = s3d_tri->tex_base;
  1886. for (c = 9; c >= 0; c--)
  1887. {
  1888. @@ -3248,8 +3118,8 @@ static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri)
  1889. default:
  1890. pclog("bad triangle type %x\n", (s3d_tri->cmd_set >> 27) & 0xf);
  1891. return;
  1892. - }
  1893. -
  1894. + }
  1895. +
  1896. switch (((s3d_tri->cmd_set >> 12) & 7) | ((s3d_tri->cmd_set & (1 << 29)) ? 8 : 0))
  1897. {
  1898. case 0: case 1:
  1899. @@ -3297,7 +3167,7 @@ static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri)
  1900. // pclog("use tex_sample_persp_normal_filter\n");
  1901. break;
  1902. }
  1903. -
  1904. +
  1905. switch ((s3d_tri->cmd_set >> 5) & 7)
  1906. {
  1907. case 0:
  1908. @@ -3316,7 +3186,7 @@ static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri)
  1909. tex_read = (s3d_tri->cmd_set & CMD_SET_TWE) ? tex_ARGB1555 : tex_ARGB1555_nowrap;
  1910. break;
  1911. }
  1912. -
  1913. +
  1914. // pclog("Triangle %i %i,%i to %i,%i %08x\n", y, x1 >> 20, y, s3d_tri->txend01 >> 20, y - (s3d_tri->ty01 + s3d_tri->ty12), state.cmd_set);
  1915.  
  1916. state.y = s3d_tri->tys;
  1917. @@ -3329,47 +3199,15 @@ static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri)
  1918. virge->tri_count++;
  1919.  
  1920. end_time = timer_read();
  1921. -
  1922. - virge_time += end_time - start_time;
  1923. -}
  1924.  
  1925. -static void render_thread(void *param)
  1926. -{
  1927. - virge_t *virge = (virge_t *)param;
  1928. -
  1929. - while (1)
  1930. - {
  1931. - thread_wait_event(virge->wake_render_thread, -1);
  1932. - thread_reset_event(virge->wake_render_thread);
  1933. - virge->s3d_busy = 1;
  1934. - while (!RB_EMPTY)
  1935. - {
  1936. - s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx & RB_MASK]);
  1937. - virge->s3d_read_idx++;
  1938. -
  1939. - if (RB_ENTRIES == RB_SIZE - 1)
  1940. - thread_set_event(virge->not_full_event);
  1941. - }
  1942. - virge->s3d_busy = 0;
  1943. - virge->subsys_stat |= INT_S3D_DONE;
  1944. - s3_virge_update_irqs(virge);
  1945. - }
  1946. + virge_time += end_time - start_time;
  1947. }
  1948.  
  1949. static void queue_triangle(virge_t *virge)
  1950. {
  1951. -// pclog("queue_triangle: read=%i write=%i RB_ENTRIES=%i RB_FULL=%i\n", virge->s3d_read_idx, virge->s3d_write_idx, RB_ENTRIES, RB_FULL);
  1952. - if (RB_FULL)
  1953. - {
  1954. - thread_reset_event(virge->not_full_event);
  1955. - if (RB_FULL)
  1956. - thread_wait_event(virge->not_full_event, -1); /*Wait for room in ringbuffer*/
  1957. - }
  1958. -// pclog(" add at read=%i write=%i %i\n", virge->s3d_read_idx, virge->s3d_write_idx, virge->s3d_write_idx & RB_MASK);
  1959. - virge->s3d_buffer[virge->s3d_write_idx & RB_MASK] = virge->s3d_tri;
  1960. - virge->s3d_write_idx++;
  1961. - if (!virge->s3d_busy)
  1962. - thread_set_event(virge->wake_render_thread); /*Wake up render thread if moving from idle*/
  1963. + s3_virge_triangle(virge, &virge->s3d_tri);
  1964. + virge->subsys_stat |= INT_S3D_DONE;
  1965. + s3_virge_update_irqs(virge);
  1966. }
  1967.  
  1968. static void s3_virge_hwcursor_draw(svga_t *svga, int displine)
  1969. @@ -3380,20 +3218,20 @@ static void s3_virge_hwcursor_draw(svga_t *svga, int displine)
  1970. int xx;
  1971. int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff;
  1972. uint32_t fg, bg;
  1973. -
  1974. +
  1975. // pclog("HWcursor %i %i %08x %08x\n", svga->hwcursor_latch.x, svga->hwcursor_latch.y, virge->hwcursor_col[0],virge->hwcursor_col[1]);
  1976. switch (svga->bpp)
  1977. - {
  1978. + {
  1979. case 15:
  1980. fg = video_15to32[virge->hwc_fg_col & 0xffff];
  1981. bg = video_15to32[virge->hwc_bg_col & 0xffff];
  1982. break;
  1983. -
  1984. +
  1985. case 16:
  1986. fg = video_16to32[virge->hwc_fg_col & 0xffff];
  1987. bg = video_16to32[virge->hwc_bg_col & 0xffff];
  1988. break;
  1989. -
  1990. +
  1991. case 24: case 32:
  1992. fg = virge->hwc_fg_col;
  1993. bg = virge->hwc_bg_col;
  1994. @@ -3419,7 +3257,7 @@ static void s3_virge_hwcursor_draw(svga_t *svga, int displine)
  1995. if (dat[0] & 0x8000)
  1996. ((uint32_t *)buffer32->line[displine])[offset + 32] = (dat[1] & 0x8000) ? fg : bg;
  1997. }
  1998. -
  1999. +
  2000. offset++;
  2001. dat[0] <<= 1;
  2002. dat[1] <<= 1;
  2003. @@ -3438,7 +3276,7 @@ static void s3_virge_hwcursor_draw(svga_t *svga, int displine)
  2004. ((uint32_t *)buffer32->line[displine])[offset + 32] ^= 0xffffff;
  2005. // pclog("Plot %i, %i (%i %i) %04X %04X\n", offset, displine, x+xx, svga->hwcursor_on, dat[0], dat[1]);
  2006. }
  2007. -
  2008. +
  2009. offset++;
  2010. dat[0] <<= 1;
  2011. dat[1] <<= 1;
  2012. @@ -3685,16 +3523,16 @@ static void s3_virge_overlay_draw(svga_t *svga, int displine)
  2013. int x;
  2014. uint32_t *p;
  2015. uint8_t *src = &svga->vram[svga->overlay_latch.addr];
  2016. -
  2017. +
  2018. p = &((uint32_t *)buffer32->line[displine])[offset + 32];
  2019. -
  2020. +
  2021. if ((offset + virge->streams.sec_w) > virge->streams.pri_w)
  2022. x_size = (virge->streams.pri_w - virge->streams.sec_x) + 1;
  2023. else
  2024. x_size = virge->streams.sec_w + 1;
  2025.  
  2026. OVERLAY_SAMPLE();
  2027. -
  2028. +
  2029. for (x = 0; x < x_size; x++)
  2030. {
  2031. *p++ = r[x_read] | (g[x_read] << 8) | (b[x_read] << 16);
  2032. @@ -3728,22 +3566,22 @@ static uint8_t s3_virge_pci_read(int func, int addr, void *p)
  2033. {
  2034. case 0x00: ret = 0x33; break; /*'S3'*/
  2035. case 0x01: ret = 0x53; break;
  2036. -
  2037. +
  2038. case 0x02: ret = virge->virge_id_low; break;
  2039. case 0x03: ret = virge->virge_id_high; break;
  2040.  
  2041. case 0x04: ret = virge->pci_regs[0x04] & 0x27; break;
  2042. -
  2043. +
  2044. case 0x07: ret = virge->pci_regs[0x07] & 0x36; break;
  2045. -
  2046. +
  2047. case 0x08: ret = 0; break; /*Revision ID*/
  2048. case 0x09: ret = 0; break; /*Programming interface*/
  2049. -
  2050. +
  2051. case 0x0a: ret = 0x00; break; /*Supports VGA interface*/
  2052. case 0x0b: ret = 0x03; /*output = 3; */break;
  2053.  
  2054. case 0x0d: ret = virge->pci_regs[0x0d] & 0xf8; break;
  2055. -
  2056. +
  2057. case 0x10: ret = 0x00; break;/*Linear frame buffer address*/
  2058. case 0x11: ret = 0x00; break;
  2059. case 0x12: ret = 0x00; break;
  2060. @@ -3755,12 +3593,12 @@ static uint8_t s3_virge_pci_read(int func, int addr, void *p)
  2061. case 0x33: ret = virge->pci_regs[0x33]; break;
  2062.  
  2063. case 0x3c: ret = virge->pci_regs[0x3c]; break;
  2064. -
  2065. +
  2066. case 0x3d: ret = 0x01; break; /*INTA*/
  2067. -
  2068. +
  2069. case 0x3e: ret = 0x04; break;
  2070. case 0x3f: ret = 0xff; break;
  2071. -
  2072. +
  2073. }
  2074. // pclog("%02X\n", ret);
  2075. return ret;
  2076. @@ -3777,7 +3615,7 @@ static void s3_virge_pci_write(int func, int addr, uint8_t val, void *p)
  2077. case 0x08: case 0x09: case 0x0a: case 0x0b:
  2078. case 0x3d: case 0x3e: case 0x3f:
  2079. return;
  2080. -
  2081. +
  2082. case PCI_REG_COMMAND:
  2083. if (val & PCI_COMMAND_IO)
  2084. {
  2085. @@ -3787,18 +3625,18 @@ static void s3_virge_pci_write(int func, int addr, uint8_t val, void *p)
  2086. else
  2087. io_removehandler(0x03c0, 0x0020, s3_virge_in, NULL, NULL, s3_virge_out, NULL, NULL, virge);
  2088. virge->pci_regs[PCI_REG_COMMAND] = val & 0x27;
  2089. - s3_virge_updatemapping(virge);
  2090. + s3_virge_updatemapping(virge);
  2091. return;
  2092. case 0x07:
  2093. virge->pci_regs[0x07] = val & 0x3e;
  2094. return;
  2095. - case 0x0d:
  2096. + case 0x0d:
  2097. virge->pci_regs[0x0d] = val & 0xf8;
  2098. return;
  2099. -
  2100. - case 0x13:
  2101. - svga->crtc[0x59] = val & 0xfc;
  2102. - s3_virge_updatemapping(virge);
  2103. +
  2104. + case 0x13:
  2105. + svga->crtc[0x59] = val & 0xfc;
  2106. + s3_virge_updatemapping(virge);
  2107. return;
  2108.  
  2109. case 0x30: case 0x32: case 0x33:
  2110. @@ -3816,7 +3654,7 @@ static void s3_virge_pci_write(int func, int addr, uint8_t val, void *p)
  2111. mem_mapping_disable(&virge->bios_rom.mapping);
  2112. }
  2113. return;
  2114. - case 0x3c:
  2115. + case 0x3c:
  2116. virge->pci_regs[0x3c] = val;
  2117. return;
  2118. }
  2119. @@ -3830,7 +3668,7 @@ static void *s3_virge_init()
  2120. virge->bilinear_enabled = device_get_config_int("bilinear");
  2121. virge->dithering_enabled = device_get_config_int("dithering");
  2122. virge->memory_size = device_get_config_int("memory");
  2123. -
  2124. +
  2125. svga_init(&virge->svga, virge, virge->memory_size << 20,
  2126. s3_virge_recalctimings,
  2127. s3_virge_in, s3_virge_out,
  2128. @@ -3872,14 +3710,14 @@ static void *s3_virge_init()
  2129. io_sethandler(0x03c0, 0x0020, s3_virge_in, NULL, NULL, s3_virge_out, NULL, NULL, virge);
  2130.  
  2131. virge->pci_regs[4] = 3;
  2132. - virge->pci_regs[5] = 0;
  2133. + virge->pci_regs[5] = 0;
  2134. virge->pci_regs[6] = 0;
  2135. virge->pci_regs[7] = 2;
  2136. virge->pci_regs[0x32] = 0x0c;
  2137. - virge->pci_regs[0x3d] = 1;
  2138. + virge->pci_regs[0x3d] = 1;
  2139. virge->pci_regs[0x3e] = 4;
  2140. virge->pci_regs[0x3f] = 0xff;
  2141. -
  2142. +
  2143. virge->virge_id_high = 0x56;
  2144. virge->virge_id_low = 0x31;
  2145. virge->virge_rev = 0;
  2146. @@ -3895,24 +3733,15 @@ static void *s3_virge_init()
  2147. virge->svga.crtc[0x36] = 2 | (0 << 2) | (1 << 4) | (0 << 5);
  2148. break;
  2149. }
  2150. -
  2151. +
  2152. virge->svga.crtc[0x37] = 1;// | (7 << 5);
  2153. virge->svga.crtc[0x53] = 1 << 3;
  2154. virge->svga.crtc[0x59] = 0x70;
  2155.  
  2156. virge->is_375 = 0;
  2157. -
  2158. +
  2159. pci_add(s3_virge_pci_read, s3_virge_pci_write, virge);
  2160. -
  2161. - virge->wake_render_thread = thread_create_event();
  2162. - virge->wake_main_thread = thread_create_event();
  2163. - virge->not_full_event = thread_create_event();
  2164. - virge->render_thread = thread_create(render_thread, virge);
  2165. -
  2166. - virge->wake_fifo_thread = thread_create_event();
  2167. - virge->fifo_not_full_event = thread_create_event();
  2168. - virge->fifo_thread = thread_create(fifo_thread, virge);
  2169. -
  2170. +
  2171. return virge;
  2172. }
  2173.  
  2174. @@ -3920,7 +3749,7 @@ static void *s3_virge_375_init()
  2175. {
  2176. virge_t *virge = malloc(sizeof(virge_t));
  2177. memset(virge, 0, sizeof(virge_t));
  2178. -
  2179. +
  2180. virge->bilinear_enabled = device_get_config_int("bilinear");
  2181. virge->dithering_enabled = device_get_config_int("dithering");
  2182. virge->memory_size = device_get_config_int("memory");
  2183. @@ -3967,14 +3796,14 @@ static void *s3_virge_375_init()
  2184. io_sethandler(0x03c0, 0x0020, s3_virge_in, NULL, NULL, s3_virge_out, NULL, NULL, virge);
  2185.  
  2186. virge->pci_regs[4] = 3;
  2187. - virge->pci_regs[5] = 0;
  2188. + virge->pci_regs[5] = 0;
  2189. virge->pci_regs[6] = 0;
  2190. virge->pci_regs[7] = 2;
  2191. virge->pci_regs[0x32] = 0x0c;
  2192. - virge->pci_regs[0x3d] = 1;
  2193. + virge->pci_regs[0x3d] = 1;
  2194. virge->pci_regs[0x3e] = 4;
  2195. virge->pci_regs[0x3f] = 0xff;
  2196. -
  2197. +
  2198. virge->virge_id_high = 0x8a;
  2199. virge->virge_id_low = 0x01;
  2200. virge->virge_rev = 0;
  2201. @@ -3994,22 +3823,13 @@ static void *s3_virge_375_init()
  2202. virge->svga.crtc[0x37] = 1;// | (7 << 5);
  2203. virge->svga.crtc[0x53] = 1 << 3;
  2204. virge->svga.crtc[0x59] = 0x70;
  2205. -
  2206. +
  2207. virge->svga.crtc[0x6c] = 0x01;
  2208. -
  2209. +
  2210. virge->is_375 = 1;
  2211. -
  2212. +
  2213. virge->card = pci_add(s3_virge_pci_read, s3_virge_pci_write, virge);
  2214. -
  2215. - virge->wake_render_thread = thread_create_event();
  2216. - virge->wake_main_thread = thread_create_event();
  2217. - virge->not_full_event = thread_create_event();
  2218. - virge->render_thread = thread_create(render_thread, virge);
  2219. -
  2220. - virge->wake_fifo_thread = thread_create_event();
  2221. - virge->fifo_not_full_event = thread_create_event();
  2222. - virge->fifo_thread = thread_create(fifo_thread, virge);
  2223. -
  2224. +
  2225. return virge;
  2226. }
  2227.  
  2228. @@ -4022,17 +3842,8 @@ static void s3_virge_close(void *p)
  2229. fclose(f);
  2230. #endif
  2231.  
  2232. - thread_kill(virge->render_thread);
  2233. - thread_destroy_event(virge->not_full_event);
  2234. - thread_destroy_event(virge->wake_main_thread);
  2235. - thread_destroy_event(virge->wake_render_thread);
  2236. -
  2237. - thread_kill(virge->fifo_thread);
  2238. - thread_destroy_event(virge->wake_fifo_thread);
  2239. - thread_destroy_event(virge->fifo_not_full_event);
  2240. -
  2241. svga_close(&virge->svga);
  2242. -
  2243. +
  2244. free(virge);
  2245. }
  2246.  
  2247. @@ -4049,7 +3860,7 @@ static int s3_virge_375_available()
  2248. static void s3_virge_speed_changed(void *p)
  2249. {
  2250. virge_t *virge = (virge_t *)p;
  2251. -
  2252. +
  2253. svga_recalctimings(&virge->svga);
  2254. }
  2255.  
  2256. diff --git a/src/video.c b/src/video.c
  2257. index 34a3789..e36f1cc 100644
  2258. --- a/src/video.c
  2259. +++ b/src/video.c
  2260. @@ -883,19 +883,19 @@ void loadfont(char *s, int format)
  2261. fclose(f);
  2262. }
  2263.  
  2264. -static struct
  2265. -{
  2266. - int x, y, y1, y2, w, h;
  2267. - int busy;
  2268. - int buffer_in_use;
  2269. -
  2270. - thread_t *blit_thread;
  2271. - event_t *wake_blit_thread;
  2272. - event_t *blit_complete;
  2273. - event_t *buffer_not_in_use;
  2274. -} blit_data;
  2275. -
  2276. -static void blit_thread(void *param);
  2277. +// static struct
  2278. +// {
  2279. +// int x, y, y1, y2, w, h;
  2280. +// int busy;
  2281. +// int buffer_in_use;
  2282. +//
  2283. + // thread_t *blit_thread;
  2284. + // event_t *wake_blit_thread;
  2285. + // event_t *blit_complete;
  2286. + // event_t *buffer_not_in_use;
  2287. +// } blit_data;
  2288. +
  2289. +// static void blit_thread(void *param);
  2290.  
  2291. uint32_t cgapal[16];
  2292.  
  2293. @@ -937,18 +937,18 @@ void initvideo()
  2294.  
  2295. cgapal_rebuild(DISPLAY_RGB, 0);
  2296.  
  2297. - blit_data.wake_blit_thread = thread_create_event();
  2298. - blit_data.blit_complete = thread_create_event();
  2299. - blit_data.buffer_not_in_use = thread_create_event();
  2300. - blit_data.blit_thread = thread_create(blit_thread, NULL);
  2301. + // blit_data.wake_blit_thread = thread_create_event();
  2302. + // blit_data.blit_complete = thread_create_event();
  2303. + // blit_data.buffer_not_in_use = thread_create_event();
  2304. + // blit_data.blit_thread = thread_create(blit_thread, NULL);
  2305. }
  2306.  
  2307. void closevideo()
  2308. {
  2309. - thread_kill(blit_data.blit_thread);
  2310. - thread_destroy_event(blit_data.buffer_not_in_use);
  2311. - thread_destroy_event(blit_data.blit_complete);
  2312. - thread_destroy_event(blit_data.wake_blit_thread);
  2313. + // thread_kill(blit_data.blit_thread);
  2314. + // thread_destroy_event(blit_data.buffer_not_in_use);
  2315. + // thread_destroy_event(blit_data.blit_complete);
  2316. + // thread_destroy_event(blit_data.wake_blit_thread);
  2317.  
  2318. free(video_15to32);
  2319. free(video_16to32);
  2320. @@ -956,37 +956,37 @@ void closevideo()
  2321. }
  2322.  
  2323.  
  2324. -static void blit_thread(void *param)
  2325. -{
  2326. - while (1)
  2327. - {
  2328. - thread_wait_event(blit_data.wake_blit_thread, -1);
  2329. - thread_reset_event(blit_data.wake_blit_thread);
  2330. -
  2331. - video_blit_memtoscreen_func(blit_data.x, blit_data.y, blit_data.y1, blit_data.y2, blit_data.w, blit_data.h);
  2332. -
  2333. - blit_data.busy = 0;
  2334. - thread_set_event(blit_data.blit_complete);
  2335. - }
  2336. -}
  2337. +// static void blit_thread(void *param)
  2338. +// {
  2339. +// while (1)
  2340. +// {
  2341. +// thread_wait_event(blit_data.wake_blit_thread, -1);
  2342. +// thread_reset_event(blit_data.wake_blit_thread);
  2343. +//
  2344. +// video_blit_memtoscreen_func(blit_data.x, blit_data.y, blit_data.y1, blit_data.y2, blit_data.w, blit_data.h);
  2345. +//
  2346. +// blit_data.busy = 0;
  2347. +// thread_set_event(blit_data.blit_complete);
  2348. +// }
  2349. +// }
  2350.  
  2351. void video_blit_complete()
  2352. {
  2353. - blit_data.buffer_in_use = 0;
  2354. - thread_set_event(blit_data.buffer_not_in_use);
  2355. + // blit_data.buffer_in_use = 0;
  2356. + // thread_set_event(blit_data.buffer_not_in_use);
  2357. }
  2358.  
  2359. void video_wait_for_blit()
  2360. {
  2361. - while (blit_data.busy)
  2362. - thread_wait_event(blit_data.blit_complete, 1);
  2363. - thread_reset_event(blit_data.blit_complete);
  2364. + // while (blit_data.busy)
  2365. + // thread_wait_event(blit_data.blit_complete, 1);
  2366. + // thread_reset_event(blit_data.blit_complete);
  2367. }
  2368. void video_wait_for_buffer()
  2369. {
  2370. - while (blit_data.buffer_in_use)
  2371. - thread_wait_event(blit_data.buffer_not_in_use, 1);
  2372. - thread_reset_event(blit_data.buffer_not_in_use);
  2373. + // while (blit_data.buffer_in_use)
  2374. + // thread_wait_event(blit_data.buffer_not_in_use, 1);
  2375. + // thread_reset_event(blit_data.buffer_not_in_use);
  2376. }
  2377.  
  2378. void video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
  2379. @@ -994,16 +994,16 @@ void video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
  2380. video_frames++;
  2381. if (h <= 0)
  2382. return;
  2383. - video_wait_for_blit();
  2384. - blit_data.busy = 1;
  2385. - blit_data.buffer_in_use = 1;
  2386. - blit_data.x = x;
  2387. - blit_data.y = y;
  2388. - blit_data.y1 = y1;
  2389. - blit_data.y2 = y2;
  2390. - blit_data.w = w;
  2391. - blit_data.h = h;
  2392. - thread_set_event(blit_data.wake_blit_thread);
  2393. + // video_wait_for_blit();
  2394. + // blit_data.busy = 1;
  2395. + // blit_data.buffer_in_use = 1;
  2396. + // blit_data.x = x;
  2397. + // blit_data.y = y;
  2398. + // blit_data.y1 = y1;
  2399. + // blit_data.y2 = y2;
  2400. + // blit_data.w = w;
  2401. + // blit_data.h = h;
  2402. + video_blit_memtoscreen_func(x, y, y1, y2, w, h);
  2403. }
  2404.  
  2405. void cgapal_rebuild(int display_type, int contrast)
  2406. diff --git a/src/wx-sdl2-display-win.c b/src/wx-sdl2-display-win.c
  2407. index cb0fcb8..cbc4dae 100644
  2408. --- a/src/wx-sdl2-display-win.c
  2409. +++ b/src/wx-sdl2-display-win.c
  2410. @@ -306,7 +306,7 @@ LRESULT CALLBACK subWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPAR
  2411.  
  2412. int display_init()
  2413. {
  2414. - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
  2415. + if (SDL_Init(SDL_INIT_VIDEO) < 0)
  2416. {
  2417. printf("SDL could not initialize! Error: %s\n", SDL_GetError());
  2418. return 0;
  2419. diff --git a/src/wx-sdl2-display.c b/src/wx-sdl2-display.c
  2420. index 239c8e1..7c83c5f 100644
  2421. --- a/src/wx-sdl2-display.c
  2422. +++ b/src/wx-sdl2-display.c
  2423. @@ -1,5 +1,6 @@
  2424. #include <SDL2/SDL.h>
  2425. #include "video.h"
  2426. +#include "wx-sdl2.h"
  2427. #include "wx-sdl2-video.h"
  2428. #include "wx-utils.h"
  2429. #include "ibm.h"
  2430. @@ -85,7 +86,7 @@ void releasemouse()
  2431.  
  2432. int display_init()
  2433. {
  2434. - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
  2435. + if (SDL_Init(SDL_INIT_VIDEO) < 0)
  2436. {
  2437. printf("SDL could not initialize! Error: %s\n", SDL_GetError());
  2438. return 0;
  2439. @@ -690,7 +691,21 @@ int renderer_thread(void* params)
  2440. if (!render())
  2441. internal_rendering = 0;
  2442.  
  2443. - SDL_Delay(1);
  2444. + SDL_LockMutex(syncMutex);
  2445. + syncRender = 0;
  2446. + SDL_CondSignal(syncCond);
  2447. + SDL_UnlockMutex(syncMutex);
  2448. +
  2449. + if (!rendering || !internal_rendering)
  2450. + break;
  2451. +
  2452. + SDL_LockMutex(syncMutex);
  2453. + while (!syncRender) {
  2454. + SDL_CondWait(syncCond, syncMutex);
  2455. + }
  2456. + SDL_UnlockMutex(syncMutex);
  2457. +
  2458. + // SDL_Delay(1);
  2459. }
  2460. window_close();
  2461. }
  2462. @@ -760,7 +775,12 @@ void renderer_stop(int timeout)
  2463. if (rendering)
  2464. {
  2465. SDL_LockMutex(rendererMutex);
  2466. + SDL_LockMutex(syncMutex);
  2467. rendering = 0;
  2468. + syncRender = 1;
  2469. + SDL_CondSignal(syncCond);
  2470. + SDL_UnlockMutex(syncMutex);
  2471. +
  2472. if (timeout)
  2473. SDL_CondWaitTimeout(rendererCond, rendererMutex, timeout);
  2474. else
  2475. diff --git a/src/wx-sdl2-video-renderer.c b/src/wx-sdl2-video-renderer.c
  2476. index 7a53092..e109761 100644
  2477. --- a/src/wx-sdl2-video-renderer.c
  2478. +++ b/src/wx-sdl2-video-renderer.c
  2479. @@ -156,7 +156,7 @@ sdl_renderer_t* sdl2_renderer_create()
  2480. renderer->close = sdl_video_renderer_close;
  2481. renderer->update = sdl_video_renderer_update;
  2482. renderer->present = sdl_video_renderer_present;
  2483. - renderer->always_update = 0;
  2484. + renderer->always_update = 1;
  2485. return renderer;
  2486. }
  2487.  
  2488. diff --git a/src/wx-sdl2.c b/src/wx-sdl2.c
  2489. index f926af0..ac9eba5 100644
  2490. --- a/src/wx-sdl2.c
  2491. +++ b/src/wx-sdl2.c
  2492. @@ -70,6 +70,11 @@ SDL_cond* mainCond;
  2493.  
  2494. SDL_Thread* mainthreadh = NULL;
  2495.  
  2496. +SDL_mutex* syncMutex;
  2497. +SDL_cond* syncCond;
  2498. +int syncRender = 1;
  2499. +
  2500. +
  2501. SDL_TimerID onesectimer;
  2502.  
  2503. int running = 0;
  2504. @@ -188,6 +193,12 @@ int mainthread(void* param)
  2505. running = 1;
  2506. while (running)
  2507. {
  2508. + SDL_LockMutex(syncMutex);
  2509. + while (syncRender) {
  2510. + SDL_CondWait(syncCond, syncMutex);
  2511. + }
  2512. + SDL_UnlockMutex(syncMutex);
  2513. +
  2514. new_time = SDL_GetTicks();
  2515. drawits += new_time - old_time;
  2516. old_time = new_time;
  2517. @@ -197,8 +208,6 @@ int mainthread(void* param)
  2518. uint64_t start_time = timer_read();
  2519. uint64_t end_time;
  2520. drawits -= 10;
  2521. - if (drawits > 50)
  2522. - drawits = 0;
  2523. runpc();
  2524. frames++;
  2525. if (frames >= 200 && nvr_dosave)
  2526. @@ -212,6 +221,11 @@ int mainthread(void* param)
  2527. }
  2528. else
  2529. SDL_Delay(1);
  2530. +
  2531. + SDL_LockMutex(syncMutex);
  2532. + syncRender = 1;
  2533. + SDL_CondSignal(syncCond);
  2534. + SDL_UnlockMutex(syncMutex);
  2535. }
  2536.  
  2537. SDL_LockMutex(mainMutex);
  2538. @@ -624,6 +638,9 @@ int start_emulation(void* params)
  2539. mainMutex = SDL_CreateMutex();
  2540. mainCond = SDL_CreateCond();
  2541.  
  2542. + syncMutex = SDL_CreateMutex();
  2543. + syncCond = SDL_CreateCond();
  2544. +
  2545. if (!loadbios())
  2546. {
  2547. if (romset != -1)
  2548. @@ -665,7 +682,7 @@ int start_emulation(void* params)
  2549. display_start(params);
  2550. mainthreadh = SDL_CreateThread(mainthread, "Main Thread", NULL);
  2551.  
  2552. - onesectimer = SDL_AddTimer(1000, timer_onesec, NULL);
  2553. + // onesectimer = SDL_AddTimer(1000, timer_onesec, NULL);
  2554.  
  2555. updatewindowsize(640, 480);
  2556.  
  2557. @@ -697,14 +714,22 @@ int stop_emulation()
  2558. SDL_DestroyCond(mainCond);
  2559. SDL_DestroyMutex(mainMutex);
  2560.  
  2561. + SDL_LockMutex(syncMutex);
  2562. + syncRender = 0;
  2563. + SDL_CondSignal(syncCond);
  2564. + SDL_UnlockMutex(syncMutex);
  2565. +
  2566. startblit();
  2567. display_stop();
  2568.  
  2569. + SDL_DestroyCond(syncCond);
  2570. + SDL_DestroyMutex(syncMutex);
  2571. +
  2572. #if SDL_VERSION_ATLEAST(2, 0, 2)
  2573. SDL_DetachThread(mainthreadh);
  2574. #endif
  2575. mainthreadh = NULL;
  2576. - SDL_RemoveTimer(onesectimer);
  2577. + // SDL_RemoveTimer(onesectimer);
  2578. savenvr();
  2579. saveconfig(NULL);
  2580.  
  2581. diff --git a/src/wx-sdl2.h b/src/wx-sdl2.h
  2582. index 416ed96..8c16faf 100644
  2583. --- a/src/wx-sdl2.h
  2584. +++ b/src/wx-sdl2.h
  2585. @@ -1,3 +1,5 @@
  2586. +#include <SDL2/SDL.h>
  2587. +
  2588. #ifdef __cplusplus
  2589. extern "C" {
  2590. #endif
  2591. @@ -16,3 +18,7 @@ extern char openfilestring[260];
  2592. extern int pause;
  2593.  
  2594. extern int take_screenshot;
  2595. +
  2596. +extern SDL_mutex* syncMutex;
  2597. +extern SDL_cond* syncCond;
  2598. +extern int syncRender;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement