d3d1x: add Wine dlls (tri, tex working, but no other testing)
This commit is contained in:
parent
ab5e9a726d
commit
38da5c9cb6
|
@ -0,0 +1,11 @@
|
|||
SUBDIRS=dxgi d3d10 d3d10_1 d3d11
|
||||
|
||||
all:
|
||||
@for dir in $(SUBDIRS) ; do $(MAKE) -C "$$dir" || exit $?; done
|
||||
|
||||
clean:
|
||||
rm -f `find . -name \*.[oa]`
|
||||
rm -f `find . -name depend`
|
||||
|
||||
install:
|
||||
sudo install */*.dll.so /usr/lib/wine
|
|
@ -0,0 +1,23 @@
|
|||
TOP=../../../../../..
|
||||
D3D1X=../..
|
||||
include $(TOP)/configs/current
|
||||
CFLAGS=$(CXXFLAGS)
|
||||
|
||||
all: lib$(LIBNAME).def lib$(LIBNAME).cross.a $(LIBNAME).dll.so
|
||||
|
||||
%.dll.fake: %.spec $(OBJECTS) version.res
|
||||
wineg++ -m32 -fasynchronous-unwind-tables -shared $^ -o $@ $(LDADD)
|
||||
|
||||
%.dll.so: %.spec $(OBJECTS) version.res
|
||||
wineg++ -m32 -fasynchronous-unwind-tables -shared $^ -o $@ $(LDADD)
|
||||
|
||||
lib%.def: %.spec
|
||||
winebuild -w --def -o $@ --export $<
|
||||
|
||||
lib%.cross.a: %.spec
|
||||
winebuild -m32 -b i586-mingw32msvc -w --implib -o $@ --export $<
|
||||
|
||||
version.res: version.rc
|
||||
wrc --nostdinc -I. -I. -I../../include -I../../include -D__WINESRC__ -fo$@ $^
|
||||
|
||||
include ../../../../Makefile.template
|
|
@ -0,0 +1,6 @@
|
|||
LIBNAME=d3d10
|
||||
LIBRARY_INCLUDES=-I$(D3D1X)/gd3dapi -I$(D3D1X)/d3dapi -I$(D3D1X)/w32api
|
||||
OBJECTS=../../dxgid3d10/libdxgid3d10.a ../../gd3d10/libgd3d10.a ../../gd3d1x/libgd3d1x.a ../../d3d1xshader/libd3d1xshader.a ../../d3d1xstutil/libd3d1xstutil.a ../../../../auxiliary/libgallium.a
|
||||
LDADD=-L../dxgi -ldxgi -ldl
|
||||
|
||||
include ../Makefile.wine
|
|
@ -0,0 +1,33 @@
|
|||
@ stub D3D10CompileEffectFromMemory
|
||||
@ stub D3D10CompileShader
|
||||
@ stdcall D3D10CreateBlob(long ptr)
|
||||
@ stdcall D3D10CreateDevice(ptr long ptr long long ptr)
|
||||
@ stdcall D3D10CreateDeviceAndSwapChain(ptr long ptr long long ptr ptr ptr)
|
||||
@ stub D3D10CreateEffectFromMemory
|
||||
@ stub D3D10CreateEffectPoolFromMemory
|
||||
@ stub D3D10CreateStateBlock
|
||||
@ stub D3D10DisassembleEffect
|
||||
@ stub D3D10DisassembleShader
|
||||
@ stdcall D3D10GetGeometryShaderProfile(ptr)
|
||||
@ stdcall D3D10GetInputAndOutputSignatureBlob(ptr long ptr)
|
||||
@ stdcall D3D10GetInputSignatureBlob(ptr long ptr)
|
||||
@ stdcall D3D10GetOutputSignatureBlob(ptr long ptr)
|
||||
@ stdcall D3D10GetPixelShaderProfile(ptr)
|
||||
@ stub D3D10GetShaderDebugInfo
|
||||
@ stub D3D10GetVersion
|
||||
@ stdcall D3D10GetVertexShaderProfile(ptr)
|
||||
@ stub D3D10PreprocessShader
|
||||
@ stub D3D10ReflectShader
|
||||
@ stub D3D10RegisterLayers
|
||||
@ stub D3D10StateBlockMaskDifference
|
||||
@ stub D3D10StateBlockMaskDisableAll
|
||||
@ stub D3D10StateBlockMaskDisableCapture
|
||||
@ stub D3D10StateBlockMaskEnableAll
|
||||
@ stub D3D10StateBlockMaskEnableCapture
|
||||
@ stub D3D10StateBlockMaskGetSetting
|
||||
@ stub D3D10StateBlockMaskIntersect
|
||||
@ stub D3D10StateBlockMaskUnion
|
||||
|
||||
@ stdcall D3D10CreateDevice1(ptr long ptr long long long ptr)
|
||||
@ stdcall D3D10CreateDeviceAndSwapChain1(ptr long ptr long long long ptr ptr ptr)
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
#define FILENAME "d3d10"
|
||||
#define NAME "D3D10"
|
||||
#include "../version.rc.h"
|
|
@ -0,0 +1,6 @@
|
|||
LIBNAME=d3d10_1
|
||||
LIBRARY_INCLUDES=
|
||||
OBJECTS=
|
||||
LDADD=-L../d3d10 -ld3d10
|
||||
|
||||
include ../Makefile.wine
|
|
@ -0,0 +1,29 @@
|
|||
@ stub D3D10CompileShader
|
||||
@ stdcall D3D10CreateBlob(long ptr) d3d10.D3D10CreateBlob
|
||||
@ stdcall D3D10CreateDevice1(ptr long ptr long long long ptr) d3d10.D3D10CreateDevice1
|
||||
@ stdcall D3D10CreateDeviceAndSwapChain1(ptr long ptr long long long ptr ptr ptr) d3d10.D3D10CreateDeviceAndSwapChain1
|
||||
@ stub D3D10CreateEffectFromMemory
|
||||
@ stub D3D10CreateEffectPoolFromMemory
|
||||
@ stub D3D10CreateStateBlock
|
||||
@ stub D3D10DisassembleEffect
|
||||
@ stub D3D10DisassembleShader
|
||||
@ stdcall D3D10GetGeometryShaderProfile(ptr) d3d10.D3D10GetGeometryShaderProfile
|
||||
@ stdcall D3D10GetInputAndOutputSignatureBlob(ptr long ptr) d3d10.D3D10GetInputAndOutputSignatureBlob
|
||||
@ stdcall D3D10GetInputSignatureBlob(ptr long ptr) d3d10.D3D10GetInputSignatureBlob
|
||||
@ stdcall D3D10GetOutputSignatureBlob(ptr long ptr) d3d10.D3D10GetOutputSignatureBlob
|
||||
@ stdcall D3D10GetPixelShaderProfile(ptr) d3d10.D3D10GetPixelShaderProfile
|
||||
@ stub D3D10GetShaderDebugInfo
|
||||
@ stub D3D10GetVersion
|
||||
@ stdcall D3D10GetVertexShaderProfile(ptr) d3d10.D3D10GetVertexShaderProfile
|
||||
@ stub D3D10PreprocessShader
|
||||
@ stub D3D10ReflectShader
|
||||
@ stub D3D10RegisterLayers
|
||||
@ stub D3D10StateBlockMaskDifference
|
||||
@ stub D3D10StateBlockMaskDisableAll
|
||||
@ stub D3D10StateBlockMaskDisableCapture
|
||||
@ stub D3D10StateBlockMaskEnableAll
|
||||
@ stub D3D10StateBlockMaskEnableCapture
|
||||
@ stub D3D10StateBlockMaskGetSetting
|
||||
@ stub D3D10StateBlockMaskIntersect
|
||||
@ stub D3D10StateBlockMaskUnion
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
#define FILENAME "d3d10"
|
||||
#define NAME "D3D10"
|
||||
#include "../version.rc.h"
|
|
@ -0,0 +1,6 @@
|
|||
LIBNAME=d3d11
|
||||
LIBRARY_INCLUDES=-I$(D3D1X)/gd3dapi -I$(D3D1X)/d3dapi -I$(D3D1X)/w32api
|
||||
OBJECTS=../../dxgid3d11/libdxgid3d11.a ../../gd3d11/libgd3d11.a ../../gd3d1x/libgd3d1x.a ../../d3d1xshader/libd3d1xshader.a ../../d3d1xstutil/libd3d1xstutil.a ../../../../auxiliary/libgallium.a
|
||||
LDADD=-L../dxgi -ldxgi -ldl
|
||||
|
||||
include ../Makefile.wine
|
|
@ -0,0 +1,6 @@
|
|||
@ stub D3D11CoreCreateDevice
|
||||
@ stub D3D11CoreCreateLayeredDevice
|
||||
@ stub D3D11CoreGetLayeredDeviceSize
|
||||
@ stub D3D11CoreRegisterLayers
|
||||
@ stdcall D3D11CreateDevice(ptr long ptr long ptr long long ptr ptr ptr)
|
||||
@ stdcall D3D11CreateDeviceAndSwapChain(ptr long ptr long ptr long long ptr ptr ptr ptr ptr)
|
|
@ -0,0 +1,3 @@
|
|||
#define FILENAME "d3d11"
|
||||
#define NAME "D3D11"
|
||||
#include "../version.rc.h"
|
|
@ -0,0 +1,6 @@
|
|||
LIBNAME=dxgi
|
||||
LIBRARY_INCLUDES=-I$(D3D1X)/gd3dapi -I$(D3D1X)/d3dapi -I$(D3D1X)/w32api
|
||||
OBJECTS=dxgi_dll.o ../../dxgi/libdxgi.a ../../d3d1xstutil/libd3d1xstutil.a ../../../egl/libegl.a ../../../../auxiliary/libgallium.a ../../../../winsys/sw/xlib/libws_xlib.a
|
||||
LDADD=-lgdi32 -lEGL -lXfixes -lX11 -ldrm -ldl -lXext
|
||||
|
||||
include ../Makefile.wine
|
|
@ -0,0 +1,4 @@
|
|||
@ stdcall CreateDXGIFactory(ptr ptr)
|
||||
@ stdcall CreateDXGIFactory1(ptr ptr)
|
||||
@ stub DXGID3D10CreateDevice
|
||||
@ stub DXGID3D10RegisterLayers
|
|
@ -0,0 +1,214 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2010 Luca Barbieri
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial
|
||||
* portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include <winnt.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <galliumdxgi.h>
|
||||
|
||||
#define DLL_WINE_PREATTACH 8
|
||||
|
||||
#define X11DRV_ESCAPE 6789
|
||||
#define X11DRV_GET_DISPLAY 0
|
||||
#define X11DRV_GET_DRAWABLE 1
|
||||
|
||||
/* Wine works in this way: wineserver stores the all window positions
|
||||
* in (somewhat fictitious) "screen coordinates", and does not itself
|
||||
* interact with X11.
|
||||
*
|
||||
* Instead, it is the responsibliity of the owner of the X window to
|
||||
* handle ConfigureNotify and inform wineserver that the window
|
||||
* moved.
|
||||
*
|
||||
* This means that we can freely look at window positions non-atomically,
|
||||
* since they won't get updated until we return and the application
|
||||
* processes the Win32 message queue.
|
||||
*
|
||||
* Of course, if this thread doesn't own the window, we are screwed.
|
||||
*
|
||||
* It might be a good idea to integrate this code in winex11.drv.
|
||||
*/
|
||||
|
||||
struct WineDXGIBackend
|
||||
{
|
||||
const IGalliumDXGIBackendVtbl *vtbl_IGalliumDXGIBackend;
|
||||
LONG ref;
|
||||
};
|
||||
|
||||
static void* STDMETHODCALLTYPE WineDXGIBackend_BeginPresent(
|
||||
IGalliumDXGIBackend* This,
|
||||
HWND hwnd,
|
||||
void** pwindow,
|
||||
RECT* prect,
|
||||
RGNDATA** prgndata,
|
||||
BOOL* ppreserve_aspect_ratio)
|
||||
{
|
||||
/* this is the parent HWND which actually has an X11 window associated */
|
||||
HWND x11_hwnd = GetAncestor(hwnd, GA_ROOT);
|
||||
HDC hdc;
|
||||
RECT client_rect;
|
||||
POINT x11_hwnd_origin_from_screen;
|
||||
Drawable drawable;
|
||||
POINT hwnd_origin_from_screen;
|
||||
HRGN hrgn;
|
||||
unsigned code = X11DRV_GET_DRAWABLE;
|
||||
unsigned rgndata_size;
|
||||
RGNDATA* rgndata;
|
||||
|
||||
hdc = GetDC(x11_hwnd);
|
||||
ExtEscape(hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, sizeof(drawable), (LPTSTR)&drawable);
|
||||
|
||||
GetDCOrgEx(hdc, &x11_hwnd_origin_from_screen);
|
||||
ReleaseDC(x11_hwnd, hdc);
|
||||
|
||||
hdc = GetDC(hwnd);
|
||||
GetDCOrgEx(hdc, &hwnd_origin_from_screen);
|
||||
hrgn = CreateRectRgn(0, 0, 0, 0);
|
||||
GetRandomRgn(hdc, hrgn, SYSRGN);
|
||||
|
||||
/* the coordinate system differs depending on whether Wine is
|
||||
* pretending to be Win9x or WinNT, so match that behavior.
|
||||
*/
|
||||
if (!(GetVersion() & 0x80000000))
|
||||
OffsetRgn(hrgn, -hwnd_origin_from_screen.x, -hwnd_origin_from_screen.y);
|
||||
ReleaseDC(hwnd, hdc);
|
||||
|
||||
*pwindow = (void*)drawable;
|
||||
GetClientRect(hwnd, &client_rect);
|
||||
|
||||
prect->left = hwnd_origin_from_screen.x - x11_hwnd_origin_from_screen.x;
|
||||
prect->top = hwnd_origin_from_screen.y - x11_hwnd_origin_from_screen.y;
|
||||
|
||||
prect->right = prect->left + client_rect.right;
|
||||
prect->bottom = prect->top + client_rect.bottom;
|
||||
|
||||
rgndata_size = GetRegionData(hrgn, 0, NULL);
|
||||
rgndata = HeapAlloc(GetProcessHeap(), 0, rgndata_size);
|
||||
GetRegionData(hrgn, rgndata_size, rgndata);
|
||||
*prgndata = rgndata;
|
||||
|
||||
// Windows doesn't preserve the aspect ratio
|
||||
// TODO: maybe let the user turn this on somehow
|
||||
*ppreserve_aspect_ratio = FALSE;
|
||||
|
||||
DeleteObject(hrgn);
|
||||
|
||||
return rgndata;
|
||||
}
|
||||
|
||||
static void STDMETHODCALLTYPE WineDXGIBackend_EndPresent(
|
||||
IGalliumDXGIBackend* This,
|
||||
HWND hwnd,
|
||||
void *present_cookie)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, present_cookie);
|
||||
}
|
||||
|
||||
/* Wine should switch to C++ at least to be able to implement COM interfaces in a sensible way,
|
||||
* instead of this ridiculous amount of clumsy duplicated code everywhere
|
||||
* C++ exists exactly to avoid having to write the following code */
|
||||
static ULONG STDMETHODCALLTYPE WineDXGIBackend_AddRef(IGalliumDXGIBackend* This)
|
||||
{
|
||||
return InterlockedIncrement(&((struct WineDXGIBackend*)&This)->ref);
|
||||
}
|
||||
|
||||
static ULONG STDMETHODCALLTYPE WineDXGIBackend_Release(IGalliumDXGIBackend* This)
|
||||
{
|
||||
ULONG v = InterlockedDecrement(&((struct WineDXGIBackend*)&This)->ref);
|
||||
if(!v)
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
return v;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WineDXGIBackend_QueryInterface(
|
||||
IGalliumDXGIBackend* iface,
|
||||
REFIID riid,
|
||||
void** ppvObject)
|
||||
{
|
||||
if (IsEqualGUID(riid, &IID_IUnknown)
|
||||
|| IsEqualGUID(riid, &IID_IGalliumDXGIBackend))
|
||||
{
|
||||
WineDXGIBackend_AddRef(iface);
|
||||
*ppvObject = iface;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static IGalliumDXGIBackendVtbl WineDXGIBackend_vtbl =
|
||||
{
|
||||
WineDXGIBackend_QueryInterface,
|
||||
WineDXGIBackend_AddRef,
|
||||
WineDXGIBackend_Release,
|
||||
WineDXGIBackend_BeginPresent,
|
||||
WineDXGIBackend_EndPresent
|
||||
};
|
||||
|
||||
IGalliumDXGIBackend* new_WineDXGIBackend()
|
||||
{
|
||||
struct WineDXGIBackend* backend = HeapAlloc(GetProcessHeap(), 0, sizeof(struct WineDXGIBackend));
|
||||
backend->ref = 1;
|
||||
backend->vtbl_IGalliumDXGIBackend = &WineDXGIBackend_vtbl;
|
||||
return (IGalliumDXGIBackend*)backend;
|
||||
}
|
||||
|
||||
static void install_wine_dxgi_backend()
|
||||
{
|
||||
IGalliumDXGIBackend* backend = new_WineDXGIBackend();
|
||||
HWND root = GetDesktopWindow();
|
||||
unsigned code = X11DRV_GET_DISPLAY;
|
||||
Display* dpy;
|
||||
HDC hdc;
|
||||
|
||||
hdc = GetDC(root);
|
||||
ExtEscape(hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, sizeof(dpy), (LPTSTR)&dpy);
|
||||
ReleaseDC(root, hdc);
|
||||
|
||||
GalliumDXGIUseX11Display(dpy, backend);
|
||||
GalliumDXGIMakeDefault();
|
||||
GalliumDXGIUseNothing();
|
||||
backend->lpVtbl->Release(backend);
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||
{
|
||||
switch (fdwReason)
|
||||
{
|
||||
case DLL_WINE_PREATTACH:
|
||||
return TRUE;
|
||||
case DLL_PROCESS_ATTACH:
|
||||
DisableThreadLibraryCalls(hinstDLL);
|
||||
install_wine_dxgi_backend();
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
#define FILENAME "dxgi"
|
||||
#define NAME "DXGI"
|
||||
#include "../version.rc.h"
|
|
@ -0,0 +1,30 @@
|
|||
1 VERSIONINFO
|
||||
FILEVERSION 6,0,6000,16386
|
||||
PRODUCTVERSION 6,0,6000,16386
|
||||
FILEFLAGSMASK 63
|
||||
FILEFLAGS 0
|
||||
FILEOS 0x00000000L
|
||||
FILETYPE 0x00000002L
|
||||
FILESUBTYPE 0x00000000L
|
||||
{
|
||||
BLOCK "StringFileInfo"
|
||||
{
|
||||
BLOCK "040904E4"
|
||||
{
|
||||
// all Wine DLLs claim to be from Microsoft, maybe it's needed for compatibility
|
||||
VALUE "CompanyName", "Microsoft Corporation"
|
||||
VALUE "FileDescription", "GalliumD3D1x " NAME " runtime"
|
||||
VALUE "FileVersion", "6.0.6000.16386"
|
||||
VALUE "InternalName", ""
|
||||
VALUE "LegalCopyright", "Copyright (c) 2010 Luca Barbieri and other contributors"
|
||||
VALUE "OriginalFilename", FILENAME ".dll"
|
||||
VALUE "ProductName", "GalliumD3D1x"
|
||||
VALUE "ProductVersion", "6.0.6000.16386"
|
||||
}
|
||||
}
|
||||
BLOCK "VarFileInfo"
|
||||
{
|
||||
VALUE "Translation", 0x0409, 0x04E4
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue