]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Overlay support.
authorToni Wilen <twilen@winuae.net>
Sat, 6 Oct 2018 15:44:33 +0000 (18:44 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 6 Oct 2018 15:44:33 +0000 (18:44 +0300)
od-win32/direct3d.cpp
od-win32/direct3d.h
od-win32/direct3d11.cpp

index a62a33b6a8f105fceeebf0681609ee35992f44f1..4f49612582954fcdd5c818624eea23affecbc399 100644 (file)
@@ -1477,10 +1477,10 @@ static void createscanlines (struct d3dstruct *d3d, int force)
        }
        for (y = 0; y < d3d->required_sl_texture_h; y += l1 + l2) {
                int y2 = y + (d3d->filterd3d->gfx_filter_scanlineoffset % (l1 + 1));
-               for (yy = 0; yy < l2 && y + yy < d3d->required_sl_texture_h; yy++) {
+               for (yy = 0; yy < l2 && y2 + yy < d3d->required_sl_texture_h; yy++) {
                        for (x = 0; x < d3d->required_sl_texture_w; x++) {
                                uae_u8 sll = sl42;
-                               p = &sld[(y + y2) * locked.Pitch + (x * bpp)];
+                               p = &sld[(y2 + yy) * locked.Pitch + (x * bpp)];
                                if (bpp < 4) {
                                        /* 16-bit, A4R4G4B4 */
                                        p[1] = (sl4 << 4) | (sll << 0);
index c8cc598571778479c57cfa7b99d9affb0a61aa3d..3d2dafa993b7c2f24d79d4cb0144635bde7b1355 100644 (file)
@@ -1,4 +1,13 @@
 
+#define EXTOVERLAYS 4
+struct extoverlay
+{
+       int idx;
+       int width, height;
+       int xpos, ypos;
+       uae_u8 *data;
+};
+
 extern void(*D3D_free)(int, bool immediate);
 extern const TCHAR* (*D3D_init)(HWND ahwnd, int, int w_w, int h_h, int depth, int *freq, int mmult);
 extern bool(*D3D_alloctexture)(int, int, int);
@@ -26,6 +35,7 @@ extern bool(*D3D_run)(int);
 extern int(*D3D_debug)(int, int);
 extern void(*D3D_led)(int, int, int);
 extern bool(*D3D_getscanline)(int*, bool*);
+extern bool(*D3D_extoverlay)(struct extoverlay*);
 
 extern LPDIRECT3DSURFACE9 D3D_capture(int, int*,int*,int*,bool);
 extern bool D3D11_capture(int, void**,int*, int*,int*,bool);
index 5514522da92fb26743b05528b9b1e26a81a565e0..88f2c443bea55d86a0bf45b7a1e09af02fe72e93 100644 (file)
@@ -66,6 +66,7 @@ bool(*D3D_run)(int);
 int(*D3D_debug)(int, int);
 void(*D3D_led)(int, int, int);
 bool(*D3D_getscanline)(int*, bool*);
+bool(*D3D_extoverlay)(struct extoverlay*);
 
 static HMODULE hd3d11, hdxgi, hd3dcompiler, dwmapi;
 
@@ -272,6 +273,8 @@ struct d3d11struct
        int mask2textureledoffsets[9 * 2];
        struct d3d11sprite blanksprite;
 
+       struct d3d11sprite extoverlays[EXTOVERLAYS];
+
        float mask2texture_w, mask2texture_h, mask2texture_ww, mask2texture_wh;
        float mask2texture_wwx, mask2texture_hhx, mask2texture_minusx, mask2texture_minusy;
        float mask2texture_multx, mask2texture_multy, mask2texture_offsetw;
@@ -1729,6 +1732,9 @@ static void FreeTextures(struct d3d11struct *d3d)
        }
        freesprite(&d3d->mask2textureled_power_dim);
        freesprite(&d3d->blanksprite);
+       for (int i = 0; i < EXTOVERLAYS; i++) {
+               freesprite(&d3d->extoverlays[i]);
+       }
 
        for (int i = 0; i < MAX_SHADERS; i++) {
                freeshaderdata(&d3d->shaders[i]);
@@ -2188,7 +2194,7 @@ static void createscanlines(struct d3d11struct *d3d, int force)
        }
        for (y = 0; y < d3d->m_screenHeight; y += l1 + l2) {
                int y2 = y + (d3d->filterd3d->gfx_filter_scanlineoffset % (l1 + 1));
-               for (yy = 0; yy < l2 && y + yy < d3d->m_screenHeight; yy++) {
+               for (yy = 0; yy < l2 && y2 + yy < d3d->m_screenHeight; yy++) {
                        for (x = 0; x < d3d->m_screenWidth; x++) {
                                uae_u8 sll = sl42;
                                p = &sld[(y2 + yy) * map.RowPitch + (x * bpp)];
@@ -4232,6 +4238,11 @@ static bool TextureShaderClass_Render(struct d3d11struct *d3d)
 
        RenderSprite(d3d, &d3d->osd);
 
+       for (int i = 0; i < EXTOVERLAYS; i++) {
+               if (d3d->extoverlays[i].enabled)
+                       RenderSprite(d3d, &d3d->extoverlays[i]);
+       }
+
        return true;
 }
 
@@ -5000,6 +5011,43 @@ static bool xD3D11_run(int monid)
        return D3D11_resize_do(d3d);
 }
 
+static bool xD3D11_extoverlay(struct extoverlay *ext)
+{
+       struct d3d11struct *d3d = &d3d11data[0];
+       D3D11_MAPPED_SUBRESOURCE map;
+       HRESULT hr;
+
+       if (ext->idx >= EXTOVERLAYS)
+               return false;
+
+       write_log(_T("extoverlay %d: x=%d y=%d %d*%d\n"), ext->idx, ext->xpos, ext->ypos, ext->width, ext->height);
+
+       struct d3d11sprite *s = &d3d->extoverlays[ext->idx];
+
+       freesprite(s);
+       if (!allocsprite(d3d, &d3d->extoverlays[ext->idx], ext->width, ext->height, true))
+               return false;
+
+       s->enabled = true;
+       s->x = ext->xpos;
+       s->y = ext->ypos;
+
+       hr = d3d->m_deviceContext->Map(s->texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+       if (FAILED(hr)) {
+               write_log(_T("extoverlay Map failed %08x\n"), hr);
+               freesprite(s);
+               return false;
+       }
+
+       for (int y = 0; y < s->height; y++) {
+               memcpy((uae_u8*)map.pData + y * map.RowPitch, ext->data + y * ext->width * 4, ext->width * 4);
+       }
+
+       d3d->m_deviceContext->Unmap(s->texture, 0);
+
+       return true;
+}
+
 void d3d11_select(void)
 {
        D3D_free = xD3D11_free;
@@ -5031,6 +5079,7 @@ void d3d11_select(void)
        D3D_debug = xD3D11_debug;
        D3D_led = xD3D11_led;
        D3D_getscanline = NULL;
+       D3D_extoverlay = xD3D11_extoverlay;
 }
 
 void d3d_select(struct uae_prefs *p)