/* * Copyright 2008 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #define COBJMACROS #include "initguid.h" #include "d3d10.h" #include "wine/test.h" HRESULT WINAPI D3D10CoreCreateDevice(IDXGIFactory *factory, IDXGIAdapter *adapter, UINT flags, void *unknown0, ID3D10Device **device); static ID3D10Device *create_device(void) { IDXGIFactory *factory = NULL; IDXGIAdapter *adapter = NULL; ID3D10Device *device = NULL; HRESULT hr; hr = CreateDXGIFactory(&IID_IDXGIFactory, (void *)&factory); if (FAILED(hr)) goto cleanup; hr = IDXGIFactory_EnumAdapters(factory, 0, &adapter); ok(SUCCEEDED(hr), "EnumAdapters failed, hr %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = D3D10CoreCreateDevice(factory, adapter, 0, NULL, &device); if (FAILED(hr)) { HMODULE d3d10ref; trace("Failed to create a HW device, trying REF\n"); IDXGIAdapter_Release(adapter); adapter = NULL; d3d10ref = LoadLibraryA("d3d10ref.dll"); if (!d3d10ref) { trace("d3d10ref.dll not available, unable to create a REF device\n"); goto cleanup; } hr = IDXGIFactory_CreateSoftwareAdapter(factory, d3d10ref, &adapter); FreeLibrary(d3d10ref); ok(SUCCEEDED(hr), "CreateSoftwareAdapter failed, hr %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = D3D10CoreCreateDevice(factory, adapter, 0, NULL, &device); ok(SUCCEEDED(hr), "Failed to create a REF device, hr %#x\n", hr); if (FAILED(hr)) goto cleanup; } cleanup: if (adapter) IDXGIAdapter_Release(adapter); if (factory) IDXGIFactory_Release(factory); return device; } static void test_device_interfaces(ID3D10Device *device) { IUnknown *obj; HRESULT hr; if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_IUnknown, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "ID3D10Device does not implement IUnknown\n"); if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_IDXGIObject, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "ID3D10Device does not implement IDXGIObject\n"); if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "ID3D10Device does not implement IDXGIDevice\n"); if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_ID3D10Device, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "ID3D10Device does not implement ID3D10Device\n"); } static void test_create_texture(ID3D10Device *device) { D3D10_TEXTURE2D_DESC desc; ID3D10Texture2D *texture; IDXGISurface *surface; HRESULT hr; desc.Width = 512; desc.Height = 512; desc.MipLevels = 1; desc.ArraySize = 1; desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D10_USAGE_DEFAULT; desc.BindFlags = D3D10_BIND_RENDER_TARGET; desc.CPUAccessFlags = 0; desc.MiscFlags = 0; hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr); hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); ok(SUCCEEDED(hr), "Texture should implement IDXGISurface\n"); if (SUCCEEDED(hr)) IDXGISurface_Release(surface); ID3D10Texture2D_Release(texture); desc.MipLevels = 0; hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr); hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); ok(FAILED(hr), "Texture should not implement IDXGISurface\n"); if (SUCCEEDED(hr)) IDXGISurface_Release(surface); ID3D10Texture2D_Release(texture); desc.MipLevels = 1; desc.ArraySize = 2; hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr); hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); ok(FAILED(hr), "Texture should not implement IDXGISurface\n"); if (SUCCEEDED(hr)) IDXGISurface_Release(surface); ID3D10Texture2D_Release(texture); } static void test_create_rendertarget_view(ID3D10Device *device) { D3D10_RENDER_TARGET_VIEW_DESC rtv_desc; D3D10_TEXTURE2D_DESC texture_desc; D3D10_BUFFER_DESC buffer_desc; ID3D10RenderTargetView *rtview; ID3D10Texture2D *texture; ID3D10Buffer *buffer; HRESULT hr; buffer_desc.ByteWidth = 1024; buffer_desc.Usage = D3D10_USAGE_DEFAULT; buffer_desc.BindFlags = D3D10_BIND_RENDER_TARGET; buffer_desc.CPUAccessFlags = 0; buffer_desc.MiscFlags = 0; hr = ID3D10Device_CreateBuffer(device, &buffer_desc, NULL, &buffer); ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x\n", hr); rtv_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; rtv_desc.ViewDimension = D3D10_RTV_DIMENSION_BUFFER; U(rtv_desc).Buffer.ElementOffset = 0; U(rtv_desc).Buffer.ElementWidth = 64; hr = ID3D10Device_CreateRenderTargetView(device, (ID3D10Resource *)buffer, &rtv_desc, &rtview); ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x\n", hr); ID3D10RenderTargetView_Release(rtview); ID3D10Buffer_Release(buffer); texture_desc.Width = 512; texture_desc.Height = 512; texture_desc.MipLevels = 1; texture_desc.ArraySize = 1; texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; texture_desc.SampleDesc.Count = 1; texture_desc.SampleDesc.Quality = 0; texture_desc.Usage = D3D10_USAGE_DEFAULT; texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET; texture_desc.CPUAccessFlags = 0; texture_desc.MiscFlags = 0; hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr); /* For texture resources it's allowed to specify NULL as desc */ hr = ID3D10Device_CreateRenderTargetView(device, (ID3D10Resource *)texture, NULL, &rtview); ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x\n", hr); ID3D10RenderTargetView_GetDesc(rtview, &rtv_desc); ok(rtv_desc.Format == texture_desc.Format, "Expected format %#x, got %#x\n", texture_desc.Format, rtv_desc.Format); ok(rtv_desc.ViewDimension == D3D10_RTV_DIMENSION_TEXTURE2D, "Expected view dimension D3D10_RTV_DIMENSION_TEXTURE2D, got %#x\n", rtv_desc.ViewDimension); ok(U(rtv_desc).Texture2D.MipSlice == 0, "Expected mip slice 0, got %#x\n", U(rtv_desc).Texture2D.MipSlice); ID3D10RenderTargetView_Release(rtview); ID3D10Texture2D_Release(texture); } START_TEST(device) { ID3D10Device *device; ULONG refcount; device = create_device(); if (!device) { skip("Failed to create device, skipping tests\n"); return; } test_device_interfaces(device); test_create_texture(device); test_create_rendertarget_view(device); refcount = ID3D10Device_Release(device); ok(!refcount, "Device has %u references left\n", refcount); }