1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/surface/d3d9_utils_win.h"
#include "base/file_path.h"
#include "base/scoped_native_library.h"
#include "base/win/scoped_comptr.h"
#include "ui/gfx/size.h"
namespace {
const wchar_t kD3D9ModuleName[] = L"d3d9.dll";
const char kCreate3D9DeviceExName[] = "Direct3DCreate9Ex";
typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT sdk_version,
IDirect3D9Ex **d3d);
} // namespace
namespace ui_surface_d3d9_utils {
bool LoadD3D9(base::ScopedNativeLibrary* storage) {
storage->Reset(base::LoadNativeLibrary(FilePath(kD3D9ModuleName), NULL));
return storage->is_valid();
}
bool CreateDevice(const base::ScopedNativeLibrary& d3d_module,
D3DDEVTYPE device_type,
uint32 presentation_interval,
IDirect3DDevice9Ex** device) {
Direct3DCreate9ExFunc create_func = reinterpret_cast<Direct3DCreate9ExFunc>(
d3d_module.GetFunctionPointer(kCreate3D9DeviceExName));
if (!create_func)
return false;
base::win::ScopedComPtr<IDirect3D9Ex> d3d;
HRESULT hr = create_func(D3D_SDK_VERSION, d3d.Receive());
if (FAILED(hr))
return false;
// Any old window will do to create the device. In practice the window to
// present to is an argument to IDirect3DDevice9::Present.
HWND window = GetShellWindow();
D3DPRESENT_PARAMETERS parameters = { 0 };
parameters.BackBufferWidth = 1;
parameters.BackBufferHeight = 1;
parameters.BackBufferCount = 1;
parameters.BackBufferFormat = D3DFMT_A8R8G8B8;
parameters.hDeviceWindow = window;
parameters.Windowed = TRUE;
parameters.Flags = 0;
parameters.PresentationInterval = presentation_interval;
parameters.SwapEffect = D3DSWAPEFFECT_COPY;
hr = d3d->CreateDeviceEx(
D3DADAPTER_DEFAULT,
device_type,
window,
D3DCREATE_FPU_PRESERVE | D3DCREATE_SOFTWARE_VERTEXPROCESSING |
D3DCREATE_DISABLE_PSGP_THREADING | D3DCREATE_MULTITHREADED,
¶meters,
NULL,
device);
return SUCCEEDED(hr);
}
bool OpenSharedTexture(IDirect3DDevice9* device,
int64 surface_handle,
const gfx::Size& size,
IDirect3DTexture9** opened_texture) {
HANDLE handle = reinterpret_cast<HANDLE>(surface_handle);
HRESULT hr = device->CreateTexture(size.width(),
size.height(),
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
opened_texture,
&handle);
return SUCCEEDED(hr);
}
bool CreateTemporaryLockableSurface(IDirect3DDevice9* device,
const gfx::Size& size,
IDirect3DSurface9** surface) {
HRESULT hr = device->CreateRenderTarget(
size.width(),
size.height(),
D3DFMT_A8R8G8B8,
D3DMULTISAMPLE_NONE,
0,
TRUE,
surface,
NULL);
return SUCCEEDED(hr);
}
bool CreateTemporaryRenderTargetTexture(IDirect3DDevice9* device,
const gfx::Size& size,
IDirect3DTexture9** texture,
IDirect3DSurface9** render_target) {
HRESULT hr = device->CreateTexture(
size.width(),
size.height(),
1, // Levels
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
texture,
NULL);
if (!SUCCEEDED(hr))
return false;
hr = (*texture)->GetSurfaceLevel(0, render_target);
return SUCCEEDED(hr);
}
} // namespace ui_surface_d3d9_utils
|