• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "d3d11app.h"
2 #include <X11/Xlib.h>
3 #include <galliumdxgi.h>
4 #include <sys/time.h>
5 
6 static d3d11_application* app;
7 static IDXGISwapChain* swap_chain;
8 unsigned width, height;
9 DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM;
10 static ID3D11Device* dev;
11 static ID3D11DeviceContext* ctx;
12 
get_time()13 double get_time()
14 {
15 	struct timeval tv;
16 	gettimeofday(&tv, 0);
17 	return (double)tv.tv_sec + (double)tv.tv_usec * 0.000001;
18 }
19 
main(int argc,char ** argv)20 int main(int argc, char** argv)
21 {
22 	Display* dpy = XOpenDisplay(0);
23 	Visual* visual = DefaultVisual(dpy, DefaultScreen(dpy));
24 	Colormap cmap = XCreateColormap(dpy, RootWindow(dpy, DefaultScreen(dpy)), visual, AllocNone);
25 	XSetWindowAttributes swa;
26 	swa.colormap = cmap;
27 	swa.border_pixel = 0;
28 	swa.event_mask = StructureNotifyMask;
29 	width = 512;
30 	height = 512;
31 	Window win = XCreateWindow(dpy, RootWindow(dpy, DefaultScreen(dpy)), 0, 0, width, height, 0, CopyFromParent, InputOutput, visual, CWBorderPixel | CWColormap| CWEventMask, &swa);
32 	XMapWindow(dpy, win);
33 
34 	GalliumDXGIUseX11Display(dpy, 0);
35 
36 	DXGI_SWAP_CHAIN_DESC swap_chain_desc;
37 	memset(&swap_chain_desc, 0, sizeof(swap_chain_desc));
38 	swap_chain_desc.BufferDesc.Width = width;
39 	swap_chain_desc.BufferDesc.Height = height;
40 	swap_chain_desc.BufferDesc.Format = format;
41 	swap_chain_desc.SampleDesc.Count = 1;
42 	swap_chain_desc.SampleDesc.Quality = 0;
43 	swap_chain_desc.OutputWindow = (HWND)win;
44 	swap_chain_desc.Windowed = TRUE;
45 	swap_chain_desc.BufferCount = 3;
46 	swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
47 	swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
48 
49 	D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_10_0;
50 
51 	HRESULT hr =D3D11CreateDeviceAndSwapChain(
52 		NULL,
53 		D3D_DRIVER_TYPE_HARDWARE,
54 		NULL,
55 		D3D11_CREATE_DEVICE_SINGLETHREADED,
56 		NULL,
57 		0,
58 		D3D11_SDK_VERSION,
59 		&swap_chain_desc,
60 		&swap_chain,
61 		&dev,
62 		&feature_level,
63 		&ctx);
64 	if(!SUCCEEDED(hr))
65 	{
66 		fprintf(stderr, "Failed to create D3D11 device (hresult %08x)\n", hr);
67 		return 1;
68 	}
69 
70 	app = d3d11_application_create();
71 	if(!app->init(dev, argc, argv))
72 		return 1;
73 
74 	double start_time = get_time();
75 
76 	MSG msg;
77 	for(;;)
78 	{
79 		XEvent event;
80 		if(XPending(dpy))
81 		{
82 			XNextEvent(dpy, &event);
83 			if(event.type == DestroyNotify)
84 				break;
85 			switch(event.type)
86 			{
87 			case ConfigureNotify:
88 				width = event.xconfigure.width;
89 				height = event.xconfigure.height;
90 				swap_chain->ResizeBuffers(3, width, height, format, 0);
91 				break;
92 			}
93 		}
94 		else if(width && height)
95 		{
96 			ID3D11Texture2D* tex;
97 			ID3D11RenderTargetView* rtv;
98 			ensure(swap_chain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&tex));
99 			ensure(dev->CreateRenderTargetView(tex, NULL, &rtv));
100 
101 			double ctime = get_time() - start_time;
102 
103 			app->draw(ctx, rtv, width, height, ctime);
104 			ctx->OMSetRenderTargets(0, 0, 0);
105 
106 			tex->Release();
107 			rtv->Release();
108 			swap_chain->Present(0, 0);
109 		}
110 		else
111 			XPeekEvent(dpy, &event);
112 	}
113 	return (int) msg.wParam;
114 }
115