Previous 199869 Revisions Next

r19913 Saturday 29th December, 2012 at 01:05:33 UTC by Ryan Holtz
01234567890123456789012345678901234567890123456789012345678901234567890123456789
hlsl: Added bounds-checking on presets. [MooglyGuy]

hlsl: Cleaned up render target management. May provide better behavior in games
     that use multiple resolutions, e.g. tekken3 and stv. [MooglyGuy]
[src/emu]render.c render.h screen.c screen.h
[src/osd/windows]d3dhlsl.c d3dhlsl.h drawd3d.c drawd3d.h

trunk/src/osd/windows/drawd3d.c
r19912r19913
17191719}
17201720
17211721
1722void texture_destroy(d3d_info *d3d, d3d_texture_info *info)
1723{
1724}
1725
17221726//============================================================
17231727//  texture_create
17241728//============================================================
r19912r19913
25172521
25182522   // find a match
25192523   for (texture = d3d->texlist; texture != NULL; texture = texture->next)
2524   {
25202525      if (texture->hash == texhash &&
25212526         texture->texinfo.base == prim->texture.base &&
25222527         texture->texinfo.width == prim->texture.width &&
25232528         texture->texinfo.height == prim->texture.height &&
25242529         ((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0)
2530      {
25252531         return texture;
2532      }
2533   }
25262534
2527   // nothing found
2535   // nothing found, check if we need to unregister something with hlsl
2536   if (d3d->hlsl != NULL)
2537   {
2538      for (texture = d3d->texlist; texture != NULL; texture = texture->next)
2539      {
2540         // Clear our old texture reference
2541         if (texture->hash == texhash &&
2542             texture->texinfo.base == prim->texture.base &&
2543             ((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0 &&
2544             (texture->texinfo.width != prim->texture.width ||
2545              texture->texinfo.height != prim->texture.height))
2546         {
2547            d3d->hlsl->remove_render_target(texture);
2548            break;
2549         }
2550      }
2551   }
25282552   return NULL;
25292553}
25302554
r19912r19913
25512575      texture->texinfo.seqid = prim->texture.seqid;
25522576   }
25532577}
2578
2579
2580//============================================================
2581//  d3d_cache_target::~d3d_cache_target
2582//============================================================
2583
2584d3d_cache_target::~d3d_cache_target()
2585{
2586   if (last_texture != NULL)
2587   {
2588      (*d3dintf->texture.release)(last_texture);
2589      last_texture = NULL;
2590   }
2591   if (last_target != NULL)
2592   {
2593      (*d3dintf->surface.release)(last_target);
2594      last_target = NULL;
2595   }
2596}
2597
2598
2599//============================================================
2600//  d3d_cache_target::init - initializes a target cache
2601//============================================================
2602
2603bool d3d_cache_target::init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y)
2604{
2605   HRESULT result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &last_texture);
2606   if (result != D3D_OK)
2607      return false;
2608   (*d3dintf->texture.get_surface_level)(last_texture, 0, &last_target);
2609
2610   return true;
2611}
2612
2613//============================================================
2614//  d3d_render_target::~d3d_render_target
2615//============================================================
2616
2617d3d_render_target::~d3d_render_target()
2618{
2619   for (int index = 0; index < 5; index++)
2620   {
2621      if (texture[index] != NULL)
2622      {
2623         (*d3dintf->texture.release)(texture[index]);
2624         texture[index] = NULL;
2625      }
2626      if (target[index] != NULL)
2627      {
2628         (*d3dintf->surface.release)(target[index]);
2629         target[index] = NULL;
2630      }
2631   }
2632
2633   if (prescaletexture != NULL)
2634   {
2635      (*d3dintf->texture.release)(prescaletexture);
2636      prescaletexture = NULL;
2637   }
2638   if (prescaletarget != NULL)
2639    {
2640      (*d3dintf->surface.release)(prescaletarget);
2641      prescaletarget = NULL;
2642   }
2643
2644   if (smalltexture != NULL)
2645   {
2646      (*d3dintf->texture.release)(smalltexture);
2647      smalltexture = NULL;
2648   }
2649   if (smalltarget != NULL)
2650   {
2651      (*d3dintf->surface.release)(smalltarget);
2652      smalltarget = NULL;
2653   }
2654}
2655
2656
2657//============================================================
2658//  d3d_render_target::init - initializes a render target
2659//============================================================
2660
2661bool d3d_render_target::init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y)
2662{
2663   HRESULT result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture[0]);
2664   if (result != D3D_OK)
2665      return false;
2666   (*d3dintf->texture.get_surface_level)(texture[0], 0, &target[0]);
2667
2668   result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture[1]);
2669   if (result != D3D_OK)
2670      return false;
2671   (*d3dintf->texture.get_surface_level)(texture[1], 0, &target[1]);
2672
2673   result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture[2]);
2674   if (result != D3D_OK)
2675      return false;
2676   (*d3dintf->texture.get_surface_level)(texture[2], 0, &target[2]);
2677
2678   result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture[3]);
2679   if (result != D3D_OK)
2680      return false;
2681   (*d3dintf->texture.get_surface_level)(texture[3], 0, &target[3]);
2682
2683   result = (*d3dintf->device.create_texture)(d3d->device, width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture[4]);
2684   if (result != D3D_OK)
2685      return false;
2686   (*d3dintf->texture.get_surface_level)(texture[4], 0, &target[4]);
2687
2688   result = (*d3dintf->device.create_texture)(d3d->device, width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &smalltexture);
2689   if (result != D3D_OK)
2690      return false;
2691   (*d3dintf->texture.get_surface_level)(smalltexture, 0, &smalltarget);
2692
2693   result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &prescaletexture);
2694   if (result != D3D_OK)
2695      return false;
2696   (*d3dintf->texture.get_surface_level)(prescaletexture, 0, &prescaletarget);
2697
2698   target_width = width * prescale_x;
2699   target_height = height * prescale_y;
2700
2701   return true;
2702}
trunk/src/osd/windows/d3dhlsl.c
r19912r19913
197197   prescale_force_y = 0;
198198   preset = -1;
199199   shadow_texture = NULL;
200   registered_targets = 0;
201   cyclic_target_idx = 0;
202200   options = NULL;
203201   paused = true;
204202   lastidx = -1;
203   targethead = NULL;
204   cachehead = NULL;
205205}
206206
207207
r19912r19913
292292   HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->device, surface, avi_copy_surface);
293293   if (result != D3D_OK)
294294   {
295      printf("Couldn't copy (%08x)\n", (UINT32)result);
296295      return;
297296   }
298297
r19912r19913
300299   result = (*d3dintf->surface.lock_rect)(avi_copy_surface, &rect, NULL, D3DLOCK_DISCARD);
301300   if (result != D3D_OK)
302301   {
303      printf("Couldn't lock (%08x)\n", (UINT32)result);
304302      return;
305303   }
306304
r19912r19913
346344   HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->device, surface, snap_copy_target);
347345   if (result != D3D_OK)
348346   {
349      printf("Couldn't copy (%08x)\n", (UINT32)result);
350347      return;
351348   }
352349
r19912r19913
354351   result = (*d3dintf->surface.lock_rect)(snap_copy_target, &rect, NULL, D3DLOCK_DISCARD);
355352   if (result != D3D_OK)
356353   {
357      printf("Couldn't lock (%08x)\n", (UINT32)result);
358354      return;
359355   }
360356
r19912r19913
575571
576572
577573//============================================================
574//  remove_render_target - remove an active cache target when
575//  refcount hits zero
576//============================================================
577
578void hlsl_info::remove_cache_target(d3d_cache_target *cache)
579{
580   if (cache != NULL)
581   {
582      if (cache == cachehead)
583      {
584         cachehead= cachehead->next;
585      }
586
587      if (cache->prev != NULL)
588      {
589         cache->prev->next = cache->next;
590      }
591
592      if (cache->next != NULL)
593      {
594         cache->next->prev = cache->prev;
595      }
596
597      global_free(cache);
598   }
599}
600
601
602//============================================================
603//  remove_render_target - remove an active target
604//============================================================
605
606void hlsl_info::remove_render_target(d3d_texture_info *texture)
607{
608   d3d_render_target *rt = find_render_target(texture);
609
610   if (rt != NULL)
611   {
612      if (rt == targethead)
613      {
614         targethead = targethead->next;
615      }
616
617      if (rt->prev != NULL)
618      {
619         rt->prev->next = rt->next;
620      }
621
622      if (rt->next != NULL)
623      {
624         rt->next->prev = rt->prev;
625      }
626
627      d3d_cache_target *cache = find_cache_target(rt->screen_index);
628      if (cache != NULL)
629      {
630         cache->ref_count--;
631         if (cache->ref_count == 0)
632         {
633            remove_cache_target(cache);
634         }
635      }
636      global_free(rt);
637   }
638}
639
640//============================================================
578641//  hlsl_info::set_texture
579642//============================================================
580643
r19912r19913
589652   {
590653      if(texture->prev_frame == texture->cur_frame)
591654      {
592         //printf("Paused\n");
593655         paused = true;
594656      }
595657      else
596658      {
597         //printf("Not paused\n");
598659         paused = false;
599660      }
600661
601662      texture->prev_frame = texture->cur_frame;
602      //printf("%08x cur_frame is %d\n", (UINT32)(UINT64)texture, texture->cur_frame);
603663   }
604664
605665   (*d3dintf->effect.set_texture)(effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex);
r19912r19913
627687   prescale_size_x = 1;
628688   prescale_size_y = 1;
629689   preset = downcast<windows_options &>(window->machine().options()).d3d_hlsl_preset();
690   if (preset < -1 || preset > 3)
691   {
692      preset = -1;
693   }
630694
631695   snap_width = downcast<windows_options &>(window->machine().options()).d3d_snap_width();
632696   snap_height = downcast<windows_options &>(window->machine().options()).d3d_snap_height();
r19912r19913
10221086   result = (*d3dintf->device.create_effect)(d3d->device, primary_name, &effect);
10231087   if(result != D3D_OK)
10241088   {
1025      printf("Direct3D: Unable to load primary.fx\n");
1089      mame_printf_verbose("Direct3D: Unable to load primary.fx\n");
10261090      return 1;
10271091   }
10281092
r19912r19913
10301094   result = (*d3dintf->device.create_effect)(d3d->device, post_name, &post_effect);
10311095   if(result != D3D_OK)
10321096   {
1033      printf("Direct3D: Unable to load post.fx\n");
1097      mame_printf_verbose("Direct3D: Unable to load post.fx\n");
10341098      return 1;
10351099   }
10361100
r19912r19913
10381102   result = (*d3dintf->device.create_effect)(d3d->device, prescale_name, &prescale_effect);
10391103   if(result != D3D_OK)
10401104   {
1041      printf("Direct3D: Unable to load prescale.fx\n");
1105      mame_printf_verbose("Direct3D: Unable to load prescale.fx\n");
10421106      return 1;
10431107   }
10441108
r19912r19913
10461110   result = (*d3dintf->device.create_effect)(d3d->device, pincushion_name, &pincushion_effect);
10471111   if(result != D3D_OK)
10481112   {
1049      printf("Direct3D: Unable to load pincushion.fx\n");
1113      mame_printf_verbose("Direct3D: Unable to load pincushion.fx\n");
10501114      return 1;
10511115   }
10521116
r19912r19913
10541118   result = (*d3dintf->device.create_effect)(d3d->device, phosphor_name, &phosphor_effect);
10551119   if(result != D3D_OK)
10561120   {
1057      printf("Direct3D: Unable to load phosphor.fx\n");
1121      mame_printf_verbose("Direct3D: Unable to load phosphor.fx\n");
10581122      return 1;
10591123   }
10601124
r19912r19913
10621126   result = (*d3dintf->device.create_effect)(d3d->device, focus_name, &focus_effect);
10631127   if(result != D3D_OK)
10641128   {
1065      printf("Direct3D: Unable to load focus.fx\n");
1129      mame_printf_verbose("Direct3D: Unable to load focus.fx\n");
10661130      return 1;
10671131   }
10681132
r19912r19913
10701134   result = (*d3dintf->device.create_effect)(d3d->device, deconverge_name, &deconverge_effect);
10711135   if(result != D3D_OK)
10721136   {
1073      printf("Direct3D: Unable to load deconverge.fx\n");
1137      mame_printf_verbose("Direct3D: Unable to load deconverge.fx\n");
10741138      return 1;
10751139   }
10761140
r19912r19913
10781142   result = (*d3dintf->device.create_effect)(d3d->device, color_name, &color_effect);
10791143   if(result != D3D_OK)
10801144   {
1081      printf("Direct3D: Unable to load color.fx\n");
1145      mame_printf_verbose("Direct3D: Unable to load color.fx\n");
10821146      return 1;
10831147   }
10841148
r19912r19913
10861150   result = (*d3dintf->device.create_effect)(d3d->device, yiq_encode_name, &yiq_encode_effect);
10871151   if(result != D3D_OK)
10881152   {
1089      printf("Direct3D: Unable to load yiq_encode.fx\n");
1153      mame_printf_verbose("Direct3D: Unable to load yiq_encode.fx\n");
10901154      return 1;
10911155   }
10921156
r19912r19913
10941158   result = (*d3dintf->device.create_effect)(d3d->device, yiq_decode_name, &yiq_decode_effect);
10951159   if(result != D3D_OK)
10961160   {
1097      printf("Direct3D: Unable to load yiq_decode.fx\n");
1161      mame_printf_verbose("Direct3D: Unable to load yiq_decode.fx\n");
10981162      return 1;
10991163   }
11001164
r19912r19913
11481212
11491213   HRESULT result = (*d3dintf->device.get_render_target)(d3d->device, 0, &backbuffer);
11501214   if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result);
1151
1152   for (int index = 0; index < 9; index++)
1153      screen_encountered[index] = false;
11541215}
11551216
11561217
r19912r19913
12191280
12201281
12211282//============================================================
1283//  hlsl_info::find_render_target
1284//============================================================
1285
1286d3d_render_target* hlsl_info::find_render_target(d3d_texture_info *info)
1287{
1288   d3d_render_target *curr = targethead;
1289
1290   while (curr != NULL && curr->info != info)
1291   {
1292      curr = curr->next;
1293   }
1294
1295   return curr;
1296}
1297
1298
1299//============================================================
1300//  hlsl_info::find_cache_target
1301//============================================================
1302
1303d3d_cache_target* hlsl_info::find_cache_target(int screen_index)
1304{
1305   d3d_cache_target *curr = cachehead;
1306
1307   while (curr != NULL && curr->screen_index != screen_index)
1308   {
1309      curr = curr->next;
1310   }
1311
1312   return curr;
1313}
1314
1315
1316//============================================================
12221317//  hlsl_info::render_quad
12231318//============================================================
12241319
r19912r19913
12321327
12331328   if(PRIMFLAG_GET_SCREENTEX(d3d->last_texture_flags) && poly->texture != NULL)
12341329   {
1235      int rawidx = poly->texture->target_index;
1236      int targetidx = rawidx % 9;
1237      int minidx = cyclic_target_idx - (num_screens * 2);
1238      int wrappedidx = (minidx + ((rawidx - minidx) % num_screens) + num_screens) % 9;
1239      //printf("rendering %d %d %d %d %d %d %d %d %d %f %f\n", poly->texture->target_index, rawidx, targetidx, minidx, wrappedidx, poly->texture->rawwidth, poly->texture->rawheight, d3d->width, d3d->height, (float)(poly->texture->ustop - poly->texture->ustart), (float)(poly->texture->vstop - poly->texture->vstart));
1330      d3d_render_target *rt = find_render_target(poly->texture);
1331      if (rt == NULL)
1332      {
1333         return;
1334      }
1335      d3d_cache_target *ct = find_cache_target(rt->screen_index);
12401336
1241      screen_encountered[targetidx] = true;
1242      target_in_use[targetidx] = poly->texture;
1243
1244      target_use_count[targetidx] = 60;
1245
12461337      if(options->yiq_enable)
12471338      {
12481339         /* Convert our signal into YIQ */
r19912r19913
12671358            (*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time);
12681359         }
12691360
1270         HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, target4[targetidx]);
1361         HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[4]);
12711362
12721363         if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
12731364         result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
r19912r19913
12891380         /* Convert our signal from YIQ */
12901381         curr_effect = yiq_decode_effect;
12911382
1292         (*d3dintf->effect.set_texture)(curr_effect, "Composite", texture4[targetidx]);
1383         (*d3dintf->effect.set_texture)(curr_effect, "Composite", rt->texture[4]);
12931384         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", poly->texture->d3dfinaltex);
12941385         if(options->params_dirty)
12951386         {
r19912r19913
13111402            (*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time);
13121403         }
13131404
1314         result = (*d3dintf->device.set_render_target)(d3d->device, 0, target3[targetidx]);
1405         result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[3]);
13151406
13161407         if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
13171408         result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
r19912r19913
13321423
13331424         curr_effect = color_effect;
13341425
1335         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture3[targetidx]);
1426         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[3]);
13361427      }
13371428
13381429      curr_effect = color_effect;
r19912r19913
13551446         (*d3dintf->effect.set_float)(curr_effect, "Saturation", options->saturation);
13561447      }
13571448
1358      HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, smalltarget0[targetidx]);
1449      HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->smalltarget);
13591450
13601451      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
13611452      result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
r19912r19913
13761467
13771468      /* Pre-scaling pass */
13781469      curr_effect = prescale_effect;
1379      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", smalltexture0[targetidx]);
1470      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->smalltexture);
13801471
13811472      if(options->params_dirty)
13821473      {
r19912r19913
13901481
13911482      (*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
13921483
1393      result = (*d3dintf->device.set_render_target)(d3d->device, 0, prescaletarget0[targetidx]);
1484      result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->prescaletarget);
13941485      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
13951486      result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
13961487      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
r19912r19913
14081499
14091500      /* Deconverge pass */
14101501      curr_effect = deconverge_effect;
1411      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", prescaletexture0[targetidx]);
1502      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->prescaletexture);
14121503
14131504      if(options->params_dirty)
14141505      {
r19912r19913
14261517
14271518      (*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
14281519
1429      result = (*d3dintf->device.set_render_target)(d3d->device, 0, target2[targetidx]);
1520      result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[2]);
14301521      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
14311522      result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
14321523      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
r19912r19913
14501541         /* Defocus pass 1 */
14511542         curr_effect = focus_effect;
14521543
1453         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture2[targetidx]);
1544         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[2]);
14541545
14551546         (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
14561547         (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
r19912r19913
14631554
14641555         (*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
14651556
1466         result = (*d3dintf->device.set_render_target)(d3d->device, 0, target0[targetidx]);
1557         result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
14671558         if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
14681559         result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
14691560         if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
r19912r19913
14811572
14821573         /* Defocus pass 2 */
14831574
1484         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture0[targetidx]);
1575         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
14851576
14861577         (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
14871578         (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
r19912r19913
14941585
14951586         (*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
14961587
1497         result = (*d3dintf->device.set_render_target)(d3d->device, 0, target1[targetidx]);
1588         result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]);
14981589         if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 7\n", (int)result);
14991590
15001591         for (UINT pass = 0; pass < num_passes; pass++)
r19912r19913
15131604      // the phosphors are a direct result of the incoming texture, might as well just change the
15141605      // input texture.
15151606      curr_effect = phosphor_effect;
1516      //printf("num_screens %d\n", num_screens);
15171607
15181608      if(options->params_dirty)
15191609      {
r19912r19913
15251615         (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
15261616         (*d3dintf->effect.set_vector)(curr_effect, "Phosphor", 3, options->phosphor);
15271617      }
1528      (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)target_width[targetidx]);
1529      (*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)target_height[targetidx]);
1618      (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)rt->target_width);
1619      (*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)rt->target_height);
15301620      (*d3dintf->effect.set_float)(curr_effect, "Passthrough", 0.0f);
15311621
1532      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", focus_enable ? texture1[targetidx] : texture2[targetidx]);
1533      (*d3dintf->effect.set_texture)(curr_effect, "LastPass", last_texture[wrappedidx]); // Avoid changing targets due to page flipping
1622      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", focus_enable ? rt->texture[1] : rt->texture[2]);
1623      (*d3dintf->effect.set_texture)(curr_effect, "LastPass", ct->last_texture);
15341624
1535      result = (*d3dintf->device.set_render_target)(d3d->device, 0, target0[targetidx]);
1625      result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
15361626      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 4\n", (int)result);
15371627      result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
15381628      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
r19912r19913
15531643      /* Pass along our phosphor'd screen */
15541644      curr_effect = phosphor_effect;
15551645
1556      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture0[targetidx]);
1557      (*d3dintf->effect.set_texture)(curr_effect, "LastPass", texture0[targetidx]);
1646      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
1647      (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->texture[0]);
15581648      (*d3dintf->effect.set_float)(curr_effect, "Passthrough", 1.0f);
15591649
1560      result = (*d3dintf->device.set_render_target)(d3d->device, 0, last_target[wrappedidx]); // Avoid changing targets due to page flipping
1650      result = (*d3dintf->device.set_render_target)(d3d->device, 0, ct->last_target); // Avoid changing targets due to page flipping
15611651      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 5\n", (int)result);
15621652      result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
15631653      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
r19912r19913
15801670      {
15811671         curr_effect = post_effect;
15821672
1583         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture0[targetidx]);
1673         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
15841674
15851675         result = (*d3dintf->device.set_render_target)(d3d->device, 0, avi_final_target);
15861676         if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
r19912r19913
16031693      {
16041694         curr_effect = post_effect;
16051695
1606         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture0[targetidx]);
1696         (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
16071697
16081698         result = (*d3dintf->device.set_render_target)(d3d->device, 0, snap_target);
16091699         if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
r19912r19913
16271717      /* Scanlines and shadow mask */
16281718      curr_effect = post_effect;
16291719
1630      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture0[targetidx]);
1720      (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
16311721
16321722      result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
16331723      if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
r19912r19913
16871777   if (!master_enable || !d3dintf->post_fx_available)
16881778      return;
16891779
1690   d3d_info *d3d = (d3d_info *)window->drawdata;
1691
16921780   (*d3dintf->surface.release)(backbuffer);
1693
1694   //printf("registered_targets %d\n", registered_targets);
1695
1696   // Don't check de-registration if we're paused.
1697   if(paused)
1698   {
1699      return;
1700   }
1701
1702   // Unregister any registered targets we didn't traverse in the past frame. A resolution change must
1703   // have occurred.
1704   for(int index = 0; index < 9; index++)
1705   {
1706      if(!screen_encountered[index] && smalltarget0[index] != NULL)
1707      {
1708         if(target_use_count[index] > 0)
1709         {
1710            target_use_count[index]--;
1711         }
1712         else
1713         {
1714            //printf("deregging %d\n", index);
1715            // free all textures
1716            if(target_in_use[index] != NULL)
1717            {
1718               d3d_texture_info *tex = target_in_use[index];
1719               bool found_in_active_list = false;
1720               d3d_texture_info *test_tex = d3d->texlist;
1721               while (test_tex != NULL)
1722               {
1723                  if(test_tex == tex)
1724                  {
1725                     found_in_active_list = true;
1726                     break;
1727                  }
1728                  test_tex = test_tex->next;
1729               }
1730
1731               // only clean up a texture if it won't be cleaned up by drawd3d
1732               if(!found_in_active_list)
1733               {
1734                  if (tex->d3dfinaltex != NULL)
1735                  {
1736                     (*d3dintf->texture.release)(tex->d3dfinaltex);
1737                     tex->d3dfinaltex = NULL;
1738                  }
1739                  if (tex->d3dtex != NULL && tex->d3dtex != tex->d3dfinaltex)
1740                  {
1741                     (*d3dintf->texture.release)(tex->d3dtex);
1742                     tex->d3dtex = NULL;
1743                  }
1744                  if (tex->d3dsurface != NULL)
1745                  {
1746                     (*d3dintf->surface.release)(tex->d3dsurface);
1747                  }
1748                  global_free(tex);
1749               }
1750            }
1751
1752            if (prescaletexture0[index] != NULL)
1753            {
1754               (*d3dintf->texture.release)(prescaletexture0[index]);
1755               prescaletexture0[index] = NULL;
1756            }
1757            if (texture0[index] != NULL)
1758            {
1759               (*d3dintf->texture.release)(texture0[index]);
1760               texture0[index] = NULL;
1761            }
1762            if (texture1[index] != NULL)
1763            {
1764               (*d3dintf->texture.release)(texture1[index]);
1765               texture1[index] = NULL;
1766            }
1767            if (texture2[index] != NULL)
1768            {
1769               (*d3dintf->texture.release)(texture2[index]);
1770               texture2[index] = NULL;
1771            }
1772            if (texture3[index] != NULL)
1773            {
1774               (*d3dintf->texture.release)(texture3[index]);
1775               texture3[index] = NULL;
1776            }
1777            if (texture4[index] != NULL)
1778            {
1779               (*d3dintf->texture.release)(texture4[index]);
1780               texture4[index] = NULL;
1781            }
1782            if (smalltexture0[index] != NULL)
1783            {
1784               (*d3dintf->texture.release)(smalltexture0[index]);
1785               smalltexture0[index] = NULL;
1786            }
1787            if (prescaletarget0[index] != NULL)
1788            {
1789               (*d3dintf->surface.release)(prescaletarget0[index]);
1790               prescaletarget0[index] = NULL;
1791            }
1792            if (target0[index] != NULL)
1793            {
1794               (*d3dintf->surface.release)(target0[index]);
1795               target0[index] = NULL;
1796            }
1797            if (target1[index] != NULL)
1798            {
1799               (*d3dintf->surface.release)(target1[index]);
1800               target1[index] = NULL;
1801            }
1802            if (target2[index] != NULL)
1803            {
1804               (*d3dintf->surface.release)(target2[index]);
1805               target2[index] = NULL;
1806            }
1807            if (target3[index] != NULL)
1808            {
1809               (*d3dintf->surface.release)(target3[index]);
1810               target3[index] = NULL;
1811            }
1812            if (target4[index] != NULL)
1813            {
1814               (*d3dintf->surface.release)(target4[index]);
1815               target4[index] = NULL;
1816            }
1817            if (smalltarget0[index] != NULL)
1818            {
1819               (*d3dintf->surface.release)(smalltarget0[index]);
1820               smalltarget0[index] = NULL;
1821            }
1822            if(last_texture[index] != NULL)
1823            {
1824               (*d3dintf->texture.release)(last_texture[index]);
1825               last_texture[index] = NULL;
1826            }
1827            if(last_target[index] != NULL)
1828            {
1829               (*d3dintf->surface.release)(last_target[index]);
1830               last_target[index] = NULL;
1831            }
1832            target_use_count[index] = 0;
1833            registered_targets--;
1834         }
1835      }
1836   }
18371781}
18381782
18391783
r19912r19913
18481792
18491793   d3d_info *d3d = (d3d_info *)window->drawdata;
18501794
1851   //printf("registering prescaled texture, seqid %d\n", texture->texinfo.seqid);
1852
1853   int idx = cyclic_target_idx % 9;
1854
18551795   // Find the nearest prescale factor that is over our screen size
18561796   int hlsl_prescale_x = prescale_force_x ? prescale_force_x : 1;
18571797   if(!prescale_force_x)
r19912r19913
18671807      prescale_size_y = hlsl_prescale_y;
18681808   }
18691809
1870   HRESULT result = (*d3dintf->device.create_texture)(d3d->device, scwidth * hlsl_prescale_x, scheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture0[idx]);
1871   if (result != D3D_OK)
1810   if (!add_render_target(d3d, texture, scwidth, scheight, hlsl_prescale_x, hlsl_prescale_y))
18721811      return 1;
1873   (*d3dintf->texture.get_surface_level)(texture0[idx], 0, &target0[idx]);
18741812
1875   result = (*d3dintf->device.create_texture)(d3d->device, scwidth * hlsl_prescale_x, scheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture1[idx]);
1876   if (result != D3D_OK)
1877      return 1;
1878   (*d3dintf->texture.get_surface_level)(texture1[idx], 0, &target1[idx]);
1813   options->params_dirty = true;
18791814
1880   result = (*d3dintf->device.create_texture)(d3d->device, scwidth * hlsl_prescale_x, scheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture2[idx]);
1881   if (result != D3D_OK)
1882      return 1;
1883   (*d3dintf->texture.get_surface_level)(texture2[idx], 0, &target2[idx]);
1815   enumerate_screens();
18841816
1885   result = (*d3dintf->device.create_texture)(d3d->device, scwidth * hlsl_prescale_x, scheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture3[idx]);
1886   if (result != D3D_OK)
1887      return 1;
1888   (*d3dintf->texture.get_surface_level)(texture3[idx], 0, &target3[idx]);
1817   return 0;
1818}
18891819
1890   result = (*d3dintf->device.create_texture)(d3d->device, scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture4[idx]);
1891   if (result != D3D_OK)
1892      return 1;
1893   (*d3dintf->texture.get_surface_level)(texture4[idx], 0, &target4[idx]);
18941820
1895   result = (*d3dintf->device.create_texture)(d3d->device, scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &smalltexture0[idx]);
1896   if (result != D3D_OK)
1897      return 1;
1898   (*d3dintf->texture.get_surface_level)(smalltexture0[idx], 0, &smalltarget0[idx]);
1821//============================================================
1822//  hlsl_info::add_cache_target - register a cache target
1823//============================================================
1824bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int prescale_x, int prescale_y, int screen_index)
1825{
1826   d3d_cache_target* target = (d3d_cache_target*)global_alloc_clear(d3d_cache_target);
18991827
1900   result = (*d3dintf->device.create_texture)(d3d->device, scwidth * hlsl_prescale_x, scheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &prescaletexture0[idx]);
1901   if (result != D3D_OK)
1902      return 1;
1903   (*d3dintf->texture.get_surface_level)(prescaletexture0[idx], 0, &prescaletarget0[idx]);
1828   if (!target->init(d3d, d3dintf, width, height, prescale_x, prescale_y))
1829   {
1830      global_free(target);
1831      return false;
1832   }
19041833
1905   result = (*d3dintf->device.create_texture)(d3d->device, scwidth * hlsl_prescale_x, scheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &last_texture[idx]);
1906   if (result != D3D_OK)
1907      return 1;
1908   (*d3dintf->texture.get_surface_level)(last_texture[idx], 0, &last_target[idx]);
1834   target->next = cachehead;
1835   target->prev = NULL;
19091836
1910   texture->target_index = cyclic_target_idx;
1911   target_width[idx] = scwidth * hlsl_prescale_x;
1912   target_height[idx] = scheight * hlsl_prescale_y;
1913   target_use_count[idx] = 60;
1914   target_in_use[idx] = texture;
1915   raw_target_idx[idx] = cyclic_target_idx;
1916   registered_targets++;
1917   cyclic_target_idx++;
1837   target->screen_index = screen_index;
1838   target->ref_count = 1;
19181839
1919   options->params_dirty = true;
1840   if (cachehead != NULL)
1841   {
1842      cachehead->prev = target;
1843   }
1844   cachehead = target;
19201845
1921   enumerate_screens();
1846   return true;
1847}
19221848
1923   return 0;
1849//============================================================
1850//  hlsl_info::add_render_target - register a render target
1851//============================================================
1852
1853bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int prescale_x, int prescale_y)
1854{
1855   d3d_render_target* target = (d3d_render_target*)global_alloc_clear(d3d_render_target);
1856
1857   if (!target->init(d3d, d3dintf, width, height, prescale_x, prescale_y))
1858   {
1859      global_free(target);
1860      return false;
1861   }
1862
1863   target->info = info;
1864
1865   UINT32 screen_index_data = (UINT32)info->texinfo.osddata;
1866   target->screen_index = screen_index_data >> 1;
1867   target->page_index = screen_index_data & 1;
1868
1869   d3d_cache_target* cache = find_cache_target(target->screen_index);
1870   if (cache == NULL)
1871   {
1872      if (!add_cache_target(d3d, info, width, height, prescale_x, prescale_y, target->screen_index))
1873      {
1874         global_free(target);
1875         return false;
1876      }
1877   }
1878   else
1879   {
1880      cache->ref_count++;
1881   }
1882
1883   target->next = targethead;
1884   target->prev = NULL;
1885
1886   if (targethead != NULL)
1887   {
1888      targethead->prev = target;
1889   }
1890   targethead = target;
1891
1892   return true;
19241893}
19251894
19261895//============================================================
r19912r19913
19381907
19391908int hlsl_info::register_texture(d3d_texture_info *texture)
19401909{
1910   enumerate_screens();
1911
19411912   if (!master_enable || !d3dintf->post_fx_available)
19421913      return 0;
19431914
19441915   d3d_info *d3d = (d3d_info *)window->drawdata;
19451916
1946   //printf("registering unscaled texture, seqid %d\n", texture->texinfo.seqid);
1947
1948   int idx = cyclic_target_idx % 9;
1949
19501917   // Find the nearest prescale factor that is over our screen size
19511918   int hlsl_prescale_x = prescale_force_x ? prescale_force_x : 1;
19521919   if(!prescale_force_x)
r19912r19913
19621929      prescale_size_y = hlsl_prescale_y;
19631930   }
19641931
1965   HRESULT result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth * hlsl_prescale_x, texture->rawheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture0[idx]);
1966   if (result != D3D_OK)
1932   if (!add_render_target(d3d, texture, texture->rawwidth, texture->rawheight, hlsl_prescale_x, hlsl_prescale_y))
19671933      return 1;
1968   (*d3dintf->texture.get_surface_level)(texture0[idx], 0, &target0[idx]);
19691934
1970   result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth * hlsl_prescale_x, texture->rawheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture1[idx]);
1971   if (result != D3D_OK)
1972      return 1;
1973   (*d3dintf->texture.get_surface_level)(texture1[idx], 0, &target1[idx]);
1974
1975   result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth * hlsl_prescale_x, texture->rawheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture2[idx]);
1976   if (result != D3D_OK)
1977      return 1;
1978   (*d3dintf->texture.get_surface_level)(texture2[idx], 0, &target2[idx]);
1979
1980   result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture3[idx]);
1981   if (result != D3D_OK)
1982      return 1;
1983   (*d3dintf->texture.get_surface_level)(texture3[idx], 0, &target3[idx]);
1984
1985   result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture4[idx]);
1986   if (result != D3D_OK)
1987      return 1;
1988   (*d3dintf->texture.get_surface_level)(texture4[idx], 0, &target4[idx]);
1989
1990   result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &smalltexture0[idx]);
1991   if (result != D3D_OK)
1992      return 1;
1993   (*d3dintf->texture.get_surface_level)(smalltexture0[idx], 0, &smalltarget0[idx]);
1994
1995   result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth * hlsl_prescale_x, texture->rawheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &prescaletexture0[idx]);
1996   if (result != D3D_OK)
1997      return 1;
1998   (*d3dintf->texture.get_surface_level)(prescaletexture0[idx], 0, &prescaletarget0[idx]);
1999
2000   result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth * hlsl_prescale_x, texture->rawheight * hlsl_prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &last_texture[idx]);
2001   if (result != D3D_OK)
2002      return 1;
2003   (*d3dintf->texture.get_surface_level)(last_texture[idx], 0, &last_target[idx]);
2004
2005   texture->target_index = cyclic_target_idx;
2006   target_width[idx] = texture->rawwidth * hlsl_prescale_x;
2007   target_height[idx] = texture->rawheight * hlsl_prescale_y;
2008   target_use_count[idx] = 60;
2009   target_in_use[idx] = texture;
2010   raw_target_idx[idx] = cyclic_target_idx;
2011   registered_targets++;
2012   cyclic_target_idx++;
2013
20141935   options->params_dirty = true;
20151936
2016   enumerate_screens();
2017
20181937   return 0;
20191938}
20201939
r19912r19913
21362055
21372056   for (int index = 0; index < 9; index++)
21382057   {
2139      if (prescaletexture0[index] != NULL)
2140      {
2141         (*d3dintf->texture.release)(prescaletexture0[index]);
2142         prescaletexture0[index] = NULL;
2143      }
2144      if (texture0[index] != NULL)
2145      {
2146         (*d3dintf->texture.release)(texture0[index]);
2147         texture0[index] = NULL;
2148      }
2149      if (texture1[index] != NULL)
2150      {
2151         (*d3dintf->texture.release)(texture1[index]);
2152         texture1[index] = NULL;
2153      }
2154      if (texture2[index] != NULL)
2155      {
2156         (*d3dintf->texture.release)(texture2[index]);
2157         texture2[index] = NULL;
2158      }
2159      if (texture3[index] != NULL)
2160      {
2161         (*d3dintf->texture.release)(texture3[index]);
2162         texture3[index] = NULL;
2163      }
2164      if (texture4[index] != NULL)
2165      {
2166         (*d3dintf->texture.release)(texture4[index]);
2167         texture4[index] = NULL;
2168      }
2169      if (smalltexture0[index] != NULL)
2170      {
2171         (*d3dintf->texture.release)(smalltexture0[index]);
2172         smalltexture0[index] = NULL;
2173      }
2174      if (prescaletarget0[index] != NULL)
2175      {
2176         (*d3dintf->surface.release)(prescaletarget0[index]);
2177         prescaletarget0[index] = NULL;
2178      }
2179      if (target0[index] != NULL)
2180      {
2181         (*d3dintf->surface.release)(target0[index]);
2182         target0[index] = NULL;
2183      }
2184      if (target1[index] != NULL)
2185      {
2186         (*d3dintf->surface.release)(target1[index]);
2187         target1[index] = NULL;
2188      }
2189      if (target2[index] != NULL)
2190      {
2191         (*d3dintf->surface.release)(target2[index]);
2192         target2[index] = NULL;
2193      }
2194      if (target3[index] != NULL)
2195      {
2196         (*d3dintf->surface.release)(target3[index]);
2197         target3[index] = NULL;
2198      }
2199      if (target4[index] != NULL)
2200      {
2201         (*d3dintf->surface.release)(target4[index]);
2202         target4[index] = NULL;
2203      }
2204      if (smalltarget0[index] != NULL)
2205      {
2206         (*d3dintf->surface.release)(smalltarget0[index]);
2207         smalltarget0[index] = NULL;
2208      }
2209      if (last_texture[index] != NULL)
2210      {
2211         (*d3dintf->texture.release)(last_texture[index]);
2212         last_texture[index] = NULL;
2213      }
2214      if (last_target[index] != NULL)
2215      {
2216         (*d3dintf->surface.release)(last_target[index]);
2217         last_target[index] = NULL;
2218      }
22192058   }
22202059
22212060   if (avi_copy_texture != NULL)
r19912r19913
22442083
22452084   global_free(options);
22462085
2247   registered_targets = 0;
2248
22492086   shadow_bitmap.reset();
22502087}
22512088
trunk/src/osd/windows/drawd3d.h
r19912r19913
5959//  TYPE DEFINITIONS
6060//============================================================
6161
62class d3d_info;
63
64/* d3d_cache_target is a simple linked list containing only a rednerable target and texture, used for phosphor effects */
65class d3d_cache_target
66{
67public:
68   // construction/destruction
69   d3d_cache_target() { }
70   ~d3d_cache_target();
71
72   bool init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y);
73
74   d3d_surface *last_target;
75   d3d_texture *last_texture;
76
77   int screen_index;
78   int ref_count;
79
80   d3d_cache_target *next;
81   d3d_cache_target *prev;
82};
83
84/* d3d_render_target is the information about a Direct3D render target chain */
85class d3d_render_target
86{
87public:
88   // construction/destruction
89   d3d_render_target() { }
90   ~d3d_render_target();
91
92   bool init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y);
93
94   int target_width;
95   int target_height;
96   int screen_index;
97   int page_index;
98   d3d_surface *prescaletarget;
99   d3d_texture *prescaletexture;
100   d3d_surface *smalltarget;
101   d3d_texture *smalltexture;
102   d3d_surface *target[5];
103   d3d_texture *texture[5];
104
105   d3d_texture_info *info;
106
107   d3d_render_target *next;
108   d3d_render_target *prev;
109};
110
62111/* d3d_info is the information about Direct3D for the current screen */
63112struct d3d_info
64113{
r19912r19913
122171//============================================================
123172
124173d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, UINT32 flags);
174void texture_destroy(d3d_info *d3d, d3d_texture_info *info);
125175
126176#endif
trunk/src/osd/windows/d3dhlsl.h
r19912r19913
4242#ifndef __WIN_D3DHLSL__
4343#define __WIN_D3DHLSL__
4444
45
4645#include "aviio.h"
4746
48
4947//============================================================
5048//  TYPE DEFINITIONS
5149//============================================================
5250
51class d3d_render_target;
52class d3d_cache_target;
53class d3d_info;
54
5355/* hlsl_options is the information about runtime-mutable Direct3D HLSL options */
5456/* in the future this will be moved into an OSD/emu shared buffer */
5557struct hlsl_options
r19912r19913
116118
117119   int register_texture(d3d_texture_info *texture);
118120   int register_prescaled_texture(d3d_texture_info *texture, int scwidth, int scheight);
121   bool add_render_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int prescale_x, int prescale_y);
122   bool add_cache_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int prescale_x, int prescale_y, int screen_index);
119123
120124   void window_save();
121125   void window_record();
r19912r19913
128132   void frame_complete();
129133
130134   void set_texture(d3d_texture_info *texture);
135   void remove_render_target(d3d_texture_info *texture);
131136
132137   int create_resources();
133138   void delete_resources();
r19912r19913
141146   void               end_avi_recording();
142147   void               begin_avi_recording(const char *name);
143148
144   bool               screen_encountered[9];      // whether a given screen was encountered this frame
149   d3d_render_target *      find_render_target(d3d_texture_info *info);
150   d3d_cache_target *      find_cache_target(int screen_index);
151   void               remove_cache_target(d3d_cache_target *cache);
145152
146153   d3d_base *              d3dintf;               // D3D interface
147154   win_window_info *       window;                  // D3D window info
r19912r19913
149156   bool               master_enable;            // overall enable flag
150157   bool               paused;                  // whether or not rendering is currently paused
151158   int                  num_screens;            // number of emulated physical screens
159   int                  curr_screen;            // current screen for render target operations
160   int                  curr_frame;               // current frame (0/1) of a screen for render target operations
152161   int                  lastidx;               // index of the last-encountered target
153162   bool               write_ini;               // enable external ini saving
154163   bool               read_ini;               // enable external ini loading
r19912r19913
159168   int                  preset;                  // preset, if relevant
160169   bitmap_argb32         shadow_bitmap;            // shadow mask bitmap for post-processing shader
161170   d3d_texture_info *      shadow_texture;            // shadow mask texture for post-processing shader
162   int                  registered_targets;         // number of registered HLSL targets (i.e., screens)
163   int                  cyclic_target_idx;         // cyclic index of next HLSL target slot
164171   hlsl_options *         options;               // current uniform state
172
165173   avi_file *            avi_output_file;         // AVI file
166174   bitmap_rgb32         avi_snap;               // AVI snapshot
167175   int                  avi_frame;               // AVI frame
r19912r19913
171179   d3d_texture *           avi_copy_texture;         // AVI destination texture in system memory
172180   d3d_surface *           avi_final_target;         // AVI upscaled surface
173181   d3d_texture *           avi_final_texture;         // AVI upscaled texture
182
174183   bool               render_snap;            // whether or not to take HLSL post-render snapshot
175184   bool               snap_rendered;            // whether we just rendered our HLSL post-render shot or not
176185   d3d_surface *           snap_copy_target;         // snapshot destination surface in system memory
r19912r19913
195204   d3d_effect *         yiq_decode_effect;         // pointer to the current YIQ decoder effect object
196205   d3d_vertex *         fsfx_vertices;            // pointer to our full-screen-quad object
197206
198   // render targets
199   int                  raw_target_idx[9];         // Number of targets currently in use
200   int                  target_use_count[9];      // Whether or not a target has been used yet
201   d3d_texture_info *      target_in_use[9];         // Target texture that is currently in use
202   int                  target_width[9];         // Render target width
203   int                  target_height[9];         // Render target height
204   d3d_surface *         last_target[9];            // Render target surface pointer for each screen's previous frame
205   d3d_texture *         last_texture[9];         // Render target texture pointer for each screen's previous frame
206   d3d_surface *         prescaletarget0[9];         // Render target surface pointer (prescale, if necessary)
207   d3d_surface *         target0[9];               // Render target surface pointer (pass 0, if necessary)
208   d3d_surface *         target1[9];               // Render target surface pointer (pass 1, if necessary)
209   d3d_surface *         target2[9];               // Render target surface pointer (pass 2, if necessary)
210   d3d_surface *         target3[9];               // Render target surface pointer (pass 3, if necessary)
211   d3d_surface *         target4[9];               // Render target surface pointer (pass 4, if necessary)
212   d3d_surface *         smalltarget0[9];         // Render target surface pointer (small pass 0, if necessary)
213   d3d_texture *         prescaletexture0[9];      // Render target surface pointer (prescale, if necessary)
214   d3d_texture *         texture0[9];            // Render target texture pointer (pass 0, if necessary)
215   d3d_texture *         texture1[9];            // Render target texture pointer (pass 1, if necessary)
216   d3d_texture *         texture2[9];            // Render target texture pointer (pass 2, if necessary)
217   d3d_texture *         texture3[9];            // Render target texture pointer (pass 3, if necessary)
218   d3d_texture *         texture4[9];            // Render target texture pointer (pass 4, if necessary)
219   d3d_texture *         smalltexture0[9];         // Render target texture pointer (small pass 0, if necessary)
207public:
208   d3d_render_target *      targethead;
209   d3d_cache_target *      cachehead;
220210};
221211
222212#endif
trunk/src/emu/render.c
r19912r19913
502502      texinfo.width = swidth;
503503      texinfo.height = sheight;
504504      texinfo.palette = palbase;
505      texinfo.osddata = m_osddata;
505506      texinfo.seqid = ++m_curseq;
506507      return true;
507508   }
trunk/src/emu/render.h
r19912r19913
233233   UINT32            height;            // height of the image
234234   const rgb_t *      palette;         // palette for PALETTE16 textures, LUTs for RGB15/RGB32
235235   UINT32            seqid;            // sequence ID
236   UINT64            osddata;         // aux data to pass to osd
236237};
237238
238239
r19912r19913
441442   // configure the texture bitmap
442443   void set_bitmap(bitmap_t &bitmap, const rectangle &sbounds, texture_format format);
443444
445   // set any necessary aux data
446   void set_osd_data(UINT64 data) { m_osddata = data; }
447
444448   // generic high-quality bitmap scaler
445449   static void hq_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param);
446450
r19912r19913
466470   texture_format      m_format;               // format of the texture data
467471   rgb_t *            m_bcglookup;            // dynamically allocated B/C/G lookup table
468472   UINT32            m_bcglookup_entries;      // number of B/C/G lookup entries allocated
473   UINT64            m_osddata;               // aux data to pass to osd
469474
470475   // scaling state (ARGB32 only)
471476   texture_scaler_func   m_scaler;               // scaling callback
trunk/src/emu/screen.c
r19912r19913
6262
6363const attotime screen_device::DEFAULT_FRAME_PERIOD(attotime::from_hz(DEFAULT_FRAME_RATE));
6464
65UINT32 screen_device::m_id_counter = 0;
6566
66
6767//**************************************************************************
6868//  SCREEN DEVICE
6969//**************************************************************************
r19912r19913
103103     m_frame_number(0),
104104     m_partial_updates_this_frame(0)
105105{
106   m_unique_id = m_id_counter;
107   m_id_counter++;
106108   memset(m_texture, 0, sizeof(m_texture));
107109}
108110
r19912r19913
288290
289291   // allocate raw textures
290292   m_texture[0] = machine().render().texture_alloc();
293   m_texture[0]->set_osd_data((UINT64)((m_unique_id << 1) | 0));
291294   m_texture[1] = machine().render().texture_alloc();
295   m_texture[1]->set_osd_data((UINT64)((m_unique_id << 1) | 1));
292296
293297   // configure the default cliparea
294298   render_container::user_settings settings;
trunk/src/emu/screen.h
r19912r19913
291291   bool            m_changed;               // has this bitmap changed?
292292   INT32            m_last_partial_scan;      // scanline of last partial update
293293   bitmap_argb32      m_screen_overlay_bitmap;   // screen overlay bitmap
294   UINT32            m_unique_id;            // unique id for this screen_device
294295
295296   // screen timing
296297   attoseconds_t      m_frame_period;            // attoseconds per frame
r19912r19913
333334      bitmap_t &               m_bitmap;
334335   };
335336   simple_list<auto_bitmap_item> m_auto_bitmap_list; // list of registered bitmaps
337
338   // static data
339   static UINT32      m_id_counter; // incremented for each constructed screen_device,
340                             // used as a unique identifier during runtime
336341};
337342
338343// device type definition

Previous 199869 Revisions Next


© 1997-2024 The MAME Team