static HANDLE hd3d11, hdxgi, hd3dcompiler;
+static struct gfx_filterdata *filterd3d;
+static int filterd3didx;
+
struct d3d11struct
{
IDXGISwapChain1* m_swapChain;
float m_rotationX, m_rotationY, m_rotationZ;
D3DXMATRIX m_viewMatrix;
ID3D11ShaderResourceView *texture;
- ID3D11Texture2D *texture2d;
+ ID3D11Texture2D *texture2d, *texture2dstaging;
ID3D11VertexShader* m_vertexShader;
ID3D11PixelShader* m_pixelShader;
ID3D11SamplerState* m_sampleState;
DXGI_FORMAT format;
bool m_tearingSupport;
int dmult;
- float xoffset, yoffset;
+ int xoffset, yoffset;
DXGI_SWAP_CHAIN_DESC1 swapChainDesc;
DXGI_SWAP_CHAIN_FULLSCREEN_DESC fsSwapChainDesc;
HWND ahwnd;
w = sr.right - sr.left;
h = sr.bottom - sr.top;
- d3d->xoffset = -zr.left;
- d3d->yoffset = -zr.top;
+ //d3d->xoffset = -zr.left;
+ //d3d->yoffset = -zr.top;
//write_log(_T("%.1f %.1f\n"), d3d->xoffset, d3d->yoffset);
}
if (d3d->texture2d)
d3d->texture2d->Release();
d3d->texture2d = NULL;
+ if (d3d->texture2dstaging)
+ d3d->texture2dstaging->Release();
+ d3d->texture2dstaging = NULL;
}
static bool CreateTexture(void)
struct d3d11struct *d3d = &d3d11data[0];
D3D11_TEXTURE2D_DESC desc;
+ HRESULT hr;
FreeTexture();
desc.Format = d3d->format;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DYNAMIC;
+ desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
+ desc.CPUAccessFlags = 0;
+
+ hr = d3d->m_device->CreateTexture2D(&desc, NULL, &d3d->texture2d);
+ if (FAILED(hr)) {
+ write_log(_T("CreateTexture2D (main) failed: %08x\n"), hr);
+ return false;
+ }
+
+ memset(&desc, 0, sizeof desc);
+ desc.Width = d3d->m_bitmapWidth;
+ desc.Height = d3d->m_bitmapHeight;
+ desc.MipLevels = 1;
+ desc.ArraySize = 1;
+ desc.Format = d3d->format;
+ desc.SampleDesc.Count = 1;
+ desc.SampleDesc.Quality = 0;
+ desc.Usage = D3D11_USAGE_STAGING;
+ desc.BindFlags = 0;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- HRESULT hr = d3d->m_device->CreateTexture2D(&desc, NULL, &d3d->texture2d);
+ hr = d3d->m_device->CreateTexture2D(&desc, NULL, &d3d->texture2dstaging);
if (FAILED(hr)) {
- write_log(_T("CreateTexture2D failed: %08x\n"), hr);
+ write_log(_T("CreateTexture2D (staging) failed: %08x\n"), hr);
return false;
}
// Get the length of the message.
bufferSize = errorMessage->GetBufferSize();
- write_log(_T("D3D11 Shader error: %s"), compileErrors);
+ TCHAR *s = au(compileErrors);
+
+ write_log(_T("D3D11 Shader error: %s"), s);
+
+ xfree(s);
// Release the error message.
errorMessage->Release();
}
// Create a texture sampler state description.
- samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
- samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
- samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
- samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
+ samplerDesc.Filter = filterd3d->gfx_filter_bilinear ? D3D11_FILTER_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_POINT;
+ samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
+ samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
+ samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
samplerDesc.MipLODBias = 0.0f;
samplerDesc.MaxAnisotropy = 1;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
{
struct d3d11struct *d3d = &d3d11data[0];
- float left, right, top, bottom;
+ int left, right, top, bottom;
VertexType* vertices;
D3D11_MAPPED_SUBRESOURCE mappedResource;
VertexType* verticesPtr;
HRESULT result;
- float positionX, positionY;
-
- positionX = (d3d->m_screenWidth - d3d->m_bitmapWidth) / 2.0 + d3d->xoffset;
- positionY = (d3d->m_screenHeight - d3d->m_bitmapHeight) / 2.0 + d3d->yoffset;
+ int positionX, positionY;
+ positionX = (d3d->m_screenWidth - d3d->m_bitmapWidth) / 2 + d3d->xoffset;
+ positionY = (d3d->m_screenHeight - d3d->m_bitmapHeight) / 2 + d3d->yoffset;
// Calculate the screen coordinates of the left side of the bitmap.
- left = (float)((d3d->m_screenWidth / 2) * -1) + positionX;
+ left = ((d3d->m_screenWidth + 1) / -2) + positionX;
// Calculate the screen coordinates of the right side of the bitmap.
- right = left + (float)d3d->m_bitmapWidth;
+ right = left + d3d->m_bitmapWidth;
// Calculate the screen coordinates of the top of the bitmap.
- top = (float)(d3d->m_screenHeight / 2) - positionY;
+ top = ((d3d->m_screenHeight + 1) / 2) - positionY;
// Calculate the screen coordinates of the bottom of the bitmap.
- bottom = top - (float)d3d->m_bitmapHeight;
+ bottom = top - d3d->m_bitmapHeight;
// Create the vertex array.
vertices = new VertexType[d3d->m_vertexCount];
write_log(_T("D3D11 init start\n"));
+ filterd3didx = picasso_on;
+ filterd3d = &currprefs.gf[filterd3didx];
+
if (!hd3d11)
hd3d11 = LoadLibrary(_T("D3D11.dll"));
if (!hdxgi)
write_log(_T("D3D11 CreateDXGIFactory2 %08x\n"), result);
return false;
}
- factory2 = factory4;
} else {
BOOL allowTearing = FALSE;
result = factory4.As(&factory5);
d3d->swapChainDesc.BufferCount = 2;
- d3d->swapChainDesc.Scaling = DXGI_SCALING_NONE;
+ d3d->swapChainDesc.Scaling = os_vista ? DXGI_SCALING_NONE : DXGI_SCALING_STRETCH;
d3d->swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
write_log(_T("IDXGIFactory2 MakeWindowAssociation %08x\n"), result);
}
+ d3d->invalidmode = false;
d3d->fsmode = 0;
if (isfullscreen() > 0)
D3D_resize(1);
if (d3d->invalidmode)
return NULL;
D3D11_MAPPED_SUBRESOURCE map;
- HRESULT hr = d3d->m_deviceContext->Map(d3d->texture2d, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ HRESULT hr = d3d->m_deviceContext->Map(d3d->texture2dstaging, 0, D3D11_MAP_WRITE, 0, &map);
if (FAILED(hr)) {
write_log(_T("D3D11 Map() %08x\n"), hr);
return NULL;
return;
d3d->texturelocked--;
- d3d->m_deviceContext->Unmap(d3d->texture2d, 0);
+ d3d->m_deviceContext->Unmap(d3d->texture2dstaging, 0);
+
+ D3D11_BOX box;
+ box.front = 0;
+ box.back = 1;
+ box.left = 0;
+ box.right = d3d->m_bitmapWidth;
+ box.top = 0;
+ box.bottom = d3d->m_bitmapHeight;
+ d3d->m_deviceContext->CopySubresourceRegion(d3d->texture2d, 0, 0, 0, 0, d3d->texture2dstaging, 0, &box);
}
static void xD3D11_flushtexture(int miny, int maxy)
d3d->invalidmode = true;
}
if (!d3d->invalidmode) {
- initd3d(d3d);
- xD3D11_alloctexture(d3d->m_bitmapWidth, d3d->m_bitmapHeight);
+ if (!initd3d(d3d)) {
+ xD3D11_free(true);
+ changed_prefs.gfx_api = 1;
+ d3d->invalidmode = true;
+ } else {
+ xD3D11_alloctexture(d3d->m_bitmapWidth, d3d->m_bitmapHeight);
+ }
}
}
}