From: Toni Wilen Date: Sat, 2 Mar 2019 19:31:09 +0000 (+0200) Subject: D3D11 pre/post shader viewport coordinate fixes. X-Git-Tag: 4200~31 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=4e109b314c7e8fa4fa5ec8a4250fd5b01f0c6196;p=francis%2Fwinuae.git D3D11 pre/post shader viewport coordinate fixes. --- diff --git a/od-win32/direct3d11.cpp b/od-win32/direct3d11.cpp index c08503a6..c2792907 100644 --- a/od-win32/direct3d11.cpp +++ b/od-win32/direct3d11.cpp @@ -117,6 +117,7 @@ struct shadertex ID3D11Texture2D *tex; ID3D11ShaderResourceView *rv; ID3D11RenderTargetView *rt; + D3D11_VIEWPORT *vp; }; #define MAX_TECHNIQUE_LAYOUTS 8 @@ -686,7 +687,7 @@ static bool allocfxdata(struct d3d11struct *d3d, struct shaderdata11 *s) static const uae_u16 indexes[INDEXCOUNT * 2] = { 2, 1, 0, 2, 3, 1, - 6, 5, 5, 6, 7, 5 + 6, 5, 4, 6, 7, 5 }; // Load the index array with data. for (int i = 0; i < INDEXCOUNT * 2; i++) @@ -699,7 +700,7 @@ static bool allocfxdata(struct d3d11struct *d3d, struct shaderdata11 *s) // Set up the description of the static index buffer. indexBufferDesc.Usage = D3D11_USAGE_DEFAULT; - indexBufferDesc.ByteWidth = d3d->index_buffer_bytes * INDEXCOUNT; + indexBufferDesc.ByteWidth = d3d->index_buffer_bytes * INDEXCOUNT * 2; indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; indexBufferDesc.CPUAccessFlags = 0; indexBufferDesc.MiscFlags = 0; @@ -1079,8 +1080,13 @@ static bool psEffect_LoadEffect(struct d3d11struct *d3d, const TCHAR *shaderfile allocfxdata(d3d, s); createfxvertices(d3d, s); - s->viewport.Width = (float)d3d->m_screenWidth * d3d->dmultxh; - s->viewport.Height = (float)d3d->m_screenHeight * d3d->dmultxv; + if (s->type == SHADERTYPE_BEFORE) { + s->viewport.Width = (float)d3d->m_bitmapWidth * d3d->dmultxh; + s->viewport.Height = (float)d3d->m_bitmapHeight * d3d->dmultxv; + } else { + s->viewport.Width = (float)d3d->m_screenWidth * d3d->dmultxh; + s->viewport.Height = (float)d3d->m_screenHeight * d3d->dmultxv; + } s->viewport.MinDepth = 0.0f; s->viewport.MaxDepth = 1.0f; s->viewport.TopLeftX = 0.0f; @@ -1174,13 +1180,13 @@ static void settransform2(struct d3d11struct *d3d, struct shaderdata11 *s) // Projection is (0,0,0) -> (1,1,1) xD3DXMatrixOrthoOffCenterLH(&d3d->m_matPreProj, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); // Align texels with pixels - xD3DXMatrixTranslation(&d3d->m_matPreView, -0.5f / d3d->m_bitmapWidth, 0.5f / d3d->m_bitmapHeight, 0.0f); + xD3DXMatrixTranslation(&d3d->m_matPreView, -0.5f / d3d->m_screenWidth, 0.5f / d3d->m_screenHeight, 0.0f); // Identity for world xD3DXMatrixIdentity(&d3d->m_matPreWorld); xD3DXMatrixOrthoOffCenterLH(&d3d->m_matProj2, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); - xD3DXMatrixTranslation(&d3d->m_matView2, 0.5f - 0.5f / d3d->m_bitmapWidth, 0.5f + 0.5f / d3d->m_bitmapHeight, 0.0f); + xD3DXMatrixTranslation(&d3d->m_matView2, 0.5f - 0.5f / d3d->m_screenWidth, 0.5f + 0.5f / d3d->m_screenHeight, 0.0f); xD3DXMatrixIdentity(&d3d->m_matWorld2); } @@ -1318,7 +1324,7 @@ static bool processshader(struct d3d11struct *d3d, struct shadertex *st, struct ID3D11RenderTargetView *lpNewRenderTarget; struct shadertex *lpWorkTexture; - d3d->m_deviceContext->RSSetViewports(1, &s->viewport); + d3d->m_deviceContext->RSSetViewports(1, st->vp); TurnOffAlphaBlending(d3d); @@ -4199,6 +4205,7 @@ static bool renderframe(struct d3d11struct *d3d) } if (s->type == SHADERTYPE_BEFORE || s->type == SHADERTYPE_MIDDLE) { settransform(d3d, s); + st.vp = &s->viewport; if (!processshader(d3d, &st, s, true)) return false; } @@ -4261,6 +4268,10 @@ static bool renderframe(struct d3d11struct *d3d) struct shaderdata11 *s = &d3d->shaders[i]; if (s->type == SHADERTYPE_AFTER) { settransform2(d3d, s); + if (i == after) + st.vp = &d3d->viewport; + else + st.vp = &s->viewport; if (!processshader(d3d, &st, s, i != after)) return false; }