static HRESULT WINAPI d3d8_CheckDeviceMultiSampleType(IDirect3D8 *iface, UINT adapter, D3DDEVTYPE device_type, D3DFORMAT format, BOOL windowed, D3DMULTISAMPLE_TYPE multisample_type) { struct d3d8 *d3d8 = impl_from_IDirect3D8(iface); HRESULT hr; TRACE("iface %p, adapter %u, device_type %#x, format %#x, windowed %#x, multisample_type %#x.\n", iface, adapter, device_type, format, windowed, multisample_type); wined3d_mutex_lock(); hr = wined3d_check_device_multisample_type(d3d8->wined3d, adapter, device_type, wined3dformat_from_d3dformat(format), windowed, (enum wined3d_multisample_type)multisample_type, NULL); wined3d_mutex_unlock(); return hr; }
static HRESULT WINAPI IDirect3D9Impl_CheckDeviceMultiSampleType(IDirect3D9Ex *iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; HRESULT hr; TRACE("iface %p, adapter %u, device_type %#x, format %#x, windowed %#x, multisample_type %#x, levels %p.\n", iface, Adapter, DeviceType, SurfaceFormat, Windowed, MultiSampleType, pQualityLevels); wined3d_mutex_lock(); hr = IWineD3D_CheckDeviceMultiSampleType(This->WineD3D, Adapter, DeviceType, wined3dformat_from_d3dformat(SurfaceFormat), Windowed, MultiSampleType, pQualityLevels); wined3d_mutex_unlock(); return hr; }
static HRESULT WINAPI IDirect3D8Impl_CheckDeviceMultiSampleType(IDirect3D8 *iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType) { IDirect3D8Impl *This = impl_from_IDirect3D8(iface); HRESULT hr; TRACE("iface %p, adapter %u, device_type %#x, format %#x, windowed %#x, multisample_type %#x.\n", iface, Adapter, DeviceType, SurfaceFormat, Windowed, MultiSampleType); wined3d_mutex_lock(); hr = wined3d_check_device_multisample_type(This->WineD3D, Adapter, DeviceType, wined3dformat_from_d3dformat(SurfaceFormat), Windowed, (WINED3DMULTISAMPLE_TYPE)MultiSampleType, NULL); wined3d_mutex_unlock(); return hr; }
static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9EX iface, UINT Adapter, D3DFORMAT Format) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; HRESULT hr; TRACE("iface %p, adapter %u, format %#x.\n", iface, Adapter, Format); /* Others than that not supported by d3d9, but reported by wined3d for ddraw. Filter them out */ if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5) { return 0; } wined3d_mutex_lock(); hr = IWineD3D_GetAdapterModeCount(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format)); wined3d_mutex_unlock(); return hr; }
HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *device, UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool #ifdef VBOX_WITH_WDDM , HANDLE *shared_handle , void **pavClientMem #endif ) { struct wined3d_resource_desc desc; HRESULT hr; texture->IDirect3DBaseTexture9_iface.lpVtbl = (const IDirect3DBaseTexture9Vtbl *)&d3d9_texture_3d_vtbl; texture->refcount = 1; desc.resource_type = WINED3D_RTYPE_VOLUME_TEXTURE; desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; desc.usage = usage & WINED3DUSAGE_MASK; desc.pool = pool; desc.width = width; desc.height = height; desc.depth = depth; desc.size = 0; wined3d_mutex_lock(); hr = wined3d_texture_create_3d(device->wined3d_device, &desc, levels, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture #ifdef VBOX_WITH_WDDM , shared_handle , pavClientMem #endif ); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); return hr; } texture->parent_device = &device->IDirect3DDevice9Ex_iface; IDirect3DDevice9Ex_AddRef(texture->parent_device); return D3D_OK; }
static UINT WINAPI d3d9_GetAdapterModeCountEx(IDirect3D9Ex *iface, UINT adapter, const D3DDISPLAYMODEFILTER *filter) { struct d3d9 *d3d9 = impl_from_IDirect3D9Ex(iface); UINT ret; TRACE("iface %p, adapter %u, filter %p.\n", iface, adapter, filter); if (filter->Format != D3DFMT_X8R8G8B8 && filter->Format != D3DFMT_R5G6B5) return 0; wined3d_mutex_lock(); ret = wined3d_get_adapter_mode_count(d3d9->wined3d, adapter, wined3dformat_from_d3dformat(filter->Format), filter->ScanLineOrdering); wined3d_mutex_unlock(); return ret; }
static UINT WINAPI d3d9_GetAdapterModeCount(IDirect3D9Ex *iface, UINT adapter, D3DFORMAT format) { struct d3d9 *d3d9 = impl_from_IDirect3D9Ex(iface); UINT ret; TRACE("iface %p, adapter %u, format %#x.\n", iface, adapter, format); /* Others than that not supported by d3d9, but reported by wined3d for ddraw. Filter them out. */ if (format != D3DFMT_X8R8G8B8 && format != D3DFMT_R5G6B5) return 0; wined3d_mutex_lock(); ret = wined3d_get_adapter_mode_count(d3d9->wined3d, adapter, wined3dformat_from_d3dformat(format), WINED3D_SCANLINE_ORDERING_UNKNOWN); wined3d_mutex_unlock(); return ret; }
static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(IDirect3D9Ex *iface, UINT Adapter, D3DFORMAT Format) { IDirect3D9Impl *This = impl_from_IDirect3D9Ex(iface); UINT ret; TRACE("iface %p, adapter %u, format %#x.\n", iface, Adapter, Format); /* Others than that not supported by d3d9, but reported by wined3d for ddraw. Filter them out */ if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5) { return 0; } wined3d_mutex_lock(); ret = wined3d_get_adapter_mode_count(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format)); wined3d_mutex_unlock(); return ret; }
static HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9EX iface, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; HRESULT hr; TRACE("iface %p, adapter %u, format %#x, mode_idx %u, mode %p.\n", iface, Adapter, Format, Mode, pMode); /* We can't pass this to WineD3D, otherwise it'll think it came from D3D8 or DDraw. It's supposed to fail anyway, so no harm returning failure. */ if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5) return D3DERR_INVALIDCALL; wined3d_mutex_lock(); hr = IWineD3D_EnumAdapterModes(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format), Mode, (WINED3DDISPLAYMODE *) pMode); wined3d_mutex_unlock(); if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format); return hr; }
static HRESULT WINAPI d3d9_CheckDeviceMultiSampleType(IDirect3D9Ex *iface, UINT adapter, D3DDEVTYPE device_type, D3DFORMAT format, BOOL windowed, D3DMULTISAMPLE_TYPE multisample_type, DWORD *levels) { struct d3d9 *d3d9 = impl_from_IDirect3D9Ex(iface); HRESULT hr; TRACE("iface %p, adapter %u, device_type %#x, format %#x, windowed %#x, multisample_type %#x, levels %p.\n", iface, adapter, device_type, format, windowed, multisample_type, levels); if (multisample_type > D3DMULTISAMPLE_16_SAMPLES) return D3DERR_INVALIDCALL; wined3d_mutex_lock(); hr = wined3d_check_device_multisample_type(d3d9->wined3d, adapter, device_type, wined3dformat_from_d3dformat(format), windowed, multisample_type, levels); wined3d_mutex_unlock(); if (hr == WINED3DERR_NOTAVAILABLE && levels) *levels = 1; return hr; }
HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *device, UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) { struct wined3d_resource_desc desc; DWORD surface_flags = 0; HRESULT hr; texture->IDirect3DBaseTexture9_iface.lpVtbl = (const IDirect3DBaseTexture9Vtbl *)&d3d9_texture_cube_vtbl; texture->refcount = 1; desc.resource_type = WINED3D_RTYPE_CUBE_TEXTURE; desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; desc.usage = usage & WINED3DUSAGE_MASK; desc.usage |= WINED3DUSAGE_TEXTURE; desc.pool = pool; desc.width = edge_length; desc.height = edge_length; desc.depth = 1; desc.size = 0; if (pool != D3DPOOL_DEFAULT || (usage & D3DUSAGE_DYNAMIC)) surface_flags |= WINED3D_SURFACE_MAPPABLE; wined3d_mutex_lock(); hr = wined3d_texture_create_cube(device->wined3d_device, &desc, levels, surface_flags, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d cube texture, hr %#x.\n", hr); return hr; } texture->parent_device = &device->IDirect3DDevice9Ex_iface; IDirect3DDevice9Ex_AddRef(texture->parent_device); return D3D_OK; }
HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *device, UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) { DWORD flags = 0; HRESULT hr; surface->IDirect3DSurface8_iface.lpVtbl = &Direct3DSurface8_Vtbl; surface->ref = 1; /* FIXME: Check MAX bounds of MultisampleQuality. */ if (multisample_quality > 0) { FIXME("Multisample quality set to %u, substituting 0.\n", multisample_quality); multisample_quality = 0; } if (lockable) flags |= WINED3D_SURFACE_MAPPABLE; if (discard) flags |= WINED3D_SURFACE_DISCARD; wined3d_mutex_lock(); hr = wined3d_surface_create(device->wined3d_device, width, height, wined3dformat_from_d3dformat(format), level, usage & WINED3DUSAGE_MASK, (enum wined3d_pool)pool, multisample_type, multisample_quality, WINED3D_SURFACE_TYPE_OPENGL, flags, surface, &d3d8_surface_wined3d_parent_ops, &surface->wined3d_surface); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d surface, hr %#x.\n", hr); return hr; } surface->parentDevice = &device->IDirect3DDevice8_iface; IUnknown_AddRef(surface->parentDevice); return D3D_OK; }
HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice8Impl *device, UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) { HRESULT hr; texture->IDirect3DVolumeTexture8_iface.lpVtbl = &Direct3DVolumeTexture8_Vtbl; texture->ref = 1; wined3d_mutex_lock(); hr = wined3d_texture_create_3d(device->wined3d_device, width, height, depth, levels, usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, &d3d8_volumetexture_wined3d_parent_ops, &texture->wined3d_texture); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); return hr; } texture->parentDevice = &device->IDirect3DDevice8_iface; IDirect3DDevice8_AddRef(texture->parentDevice); return D3D_OK; }
HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *device, UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) { HRESULT hr; texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DCubeTexture8_Vtbl; texture->refcount = 1; wined3d_mutex_lock(); hr = wined3d_texture_create_cube(device->wined3d_device, edge_length, levels, usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d cube texture, hr %#x.\n", hr); return hr; } texture->parent_device = &device->IDirect3DDevice8_iface; IDirect3DDevice8_AddRef(texture->parent_device); return D3D_OK; }
HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *device, UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) { HRESULT hr; texture->IDirect3DBaseTexture9_iface.lpVtbl = (const IDirect3DBaseTexture9Vtbl *)&d3d9_texture_3d_vtbl; texture->refcount = 1; wined3d_mutex_lock(); hr = wined3d_texture_create_3d(device->wined3d_device, width, height, depth, levels, usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); return hr; } texture->parent_device = &device->IDirect3DDevice9Ex_iface; IDirect3DDevice9Ex_AddRef(texture->parent_device); return D3D_OK; }
HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) { HRESULT hr; buffer->IDirect3DIndexBuffer9_iface.lpVtbl = &d3d9_indexbuffer_vtbl; buffer->ref = 1; buffer->format = wined3dformat_from_d3dformat(format); wined3d_mutex_lock(); hr = wined3d_buffer_create_ib(device->wined3d_device, size, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, buffer, &d3d9_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d buffer, hr %#x.\n", hr); return hr; } buffer->parentDevice = &device->IDirect3DDevice9Ex_iface; IDirect3DDevice9Ex_AddRef(buffer->parentDevice); return D3D_OK; }
HRESULT cubetexture_init(IDirect3DCubeTexture8Impl *texture, IDirect3DDevice8Impl *device, UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) { HRESULT hr; texture->IDirect3DCubeTexture8_iface.lpVtbl = &Direct3DCubeTexture8_Vtbl; texture->ref = 1; wined3d_mutex_lock(); hr = IWineD3DDevice_CreateCubeTexture(device->WineD3DDevice, edge_length, levels, usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, &d3d8_cubetexture_wined3d_parent_ops, &texture->wineD3DCubeTexture); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d cube texture, hr %#x.\n", hr); return hr; } texture->parentDevice = &device->IDirect3DDevice8_iface; IDirect3DDevice8_AddRef(texture->parentDevice); return D3D_OK; }
HRESULT indexbuffer_init(struct d3d9_indexbuffer *buffer, struct d3d9_device *device, UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) { const struct wined3d_parent_ops *parent_ops = &d3d9_null_wined3d_parent_ops; struct wined3d_buffer_desc desc; HRESULT hr; if (pool == D3DPOOL_SCRATCH) return D3DERR_INVALIDCALL; if (pool == D3DPOOL_MANAGED && device->d3d_parent->extended) { WARN("Managed resources are not supported by d3d9ex devices.\n"); return D3DERR_INVALIDCALL; } /* In d3d9, buffers can't be used as rendertarget or depth/stencil buffer. */ if (usage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)) return D3DERR_INVALIDCALL; desc.byte_width = size; desc.usage = (usage & WINED3DUSAGE_MASK) | WINED3DUSAGE_STATICDECL; desc.bind_flags = 0; desc.access = wined3daccess_from_d3dpool(pool, usage) | map_access_from_usage(usage); /* Buffers are always readable. */ if (pool != D3DPOOL_DEFAULT) desc.access |= WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; desc.misc_flags = 0; desc.structure_byte_stride = 0; if (desc.access & WINED3D_RESOURCE_ACCESS_GPU) { desc.bind_flags = WINED3D_BIND_INDEX_BUFFER; parent_ops = &d3d9_indexbuffer_wined3d_parent_ops; } buffer->IDirect3DIndexBuffer9_iface.lpVtbl = &d3d9_indexbuffer_vtbl; buffer->format = wined3dformat_from_d3dformat(format); buffer->usage = usage; d3d9_resource_init(&buffer->resource); wined3d_mutex_lock(); hr = wined3d_buffer_create(device->wined3d_device, &desc, NULL, buffer, parent_ops, &buffer->wined3d_buffer); if (SUCCEEDED(hr) && !(desc.access & WINED3D_RESOURCE_ACCESS_GPU)) { desc.bind_flags = WINED3D_BIND_INDEX_BUFFER; desc.access = WINED3D_RESOURCE_ACCESS_GPU; if (FAILED(hr = wined3d_buffer_create(device->wined3d_device, &desc, NULL, buffer, &d3d9_indexbuffer_wined3d_parent_ops, &buffer->draw_buffer))) wined3d_buffer_decref(buffer->wined3d_buffer); } wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d buffer, hr %#x.\n", hr); return hr; } buffer->parent_device = &device->IDirect3DDevice9Ex_iface; IDirect3DDevice9Ex_AddRef(buffer->parent_device); return D3D_OK; }