HRESULT volume_init(struct d3d9_volume *volume, struct d3d9_device *device, UINT width, UINT height, UINT depth, DWORD usage, enum wined3d_format_id format, enum wined3d_pool pool #ifdef VBOX_WITH_WDDM , HANDLE *shared_handle , void *pvClientMem #endif ) { HRESULT hr; volume->IDirect3DVolume9_iface.lpVtbl = (struct IDirect3DVolume9Vtbl *)&d3d9_volume_vtbl; volume->refcount = 1; hr = wined3d_volume_create(device->wined3d_device, width, height, depth, usage & WINED3DUSAGE_MASK, format, pool, volume, &d3d9_volume_wined3d_parent_ops, &volume->wined3d_volume #ifdef VBOX_WITH_WDDM , shared_handle , pvClientMem #endif ); if (FAILED(hr)) { WARN("Failed to create wined3d volume, hr %#x.\n", hr); return hr; } return D3D_OK; }
HRESULT volume_init(struct d3d8_volume *volume, struct d3d8_device *device, UINT width, UINT height, UINT depth, DWORD usage, enum wined3d_format_id format, enum wined3d_pool pool) { HRESULT hr; volume->IDirect3DVolume8_iface.lpVtbl = &d3d8_volume_vtbl; volume->refcount = 1; hr = wined3d_volume_create(device->wined3d_device, width, height, depth, usage, format, pool, volume, &d3d8_volume_wined3d_parent_ops, &volume->wined3d_volume); if (FAILED(hr)) { WARN("Failed to create wined3d volume, hr %#x.\n", hr); return hr; } return D3D_OK; }
HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, UINT width, UINT height, UINT depth, DWORD usage, enum wined3d_format_id format, enum wined3d_pool pool) { HRESULT hr; volume->IDirect3DVolume9_iface.lpVtbl = &Direct3DVolume9_Vtbl; volume->ref = 1; hr = wined3d_volume_create(device->wined3d_device, width, height, depth, usage & WINED3DUSAGE_MASK, format, pool, volume, &d3d9_volume_wined3d_parent_ops, &volume->wined3d_volume); if (FAILED(hr)) { WARN("Failed to create wined3d volume, hr %#x.\n", hr); return hr; } return D3D_OK; }
static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc, UINT levels, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; struct wined3d_resource_desc volume_desc; unsigned int i; HRESULT hr; /* TODO: It should only be possible to create textures for formats * that are reported as supported. */ if (WINED3DFMT_UNKNOWN >= desc->format) { WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); return WINED3DERR_INVALIDCALL; } if (!gl_info->supported[EXT_TEXTURE3D]) { WARN("(%p) : Texture cannot be created - no volume texture support.\n", texture); return WINED3DERR_INVALIDCALL; } /* Calculate levels for mip mapping. */ if (desc->usage & WINED3DUSAGE_AUTOGENMIPMAP) { if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) { WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); return WINED3DERR_INVALIDCALL; } if (levels > 1) { WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); return WINED3DERR_INVALIDCALL; } levels = 1; } else if (!levels) { levels = wined3d_log2i(max(max(desc->width, desc->height), desc->depth)) + 1; TRACE("Calculated levels = %u.\n", levels); } if (!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]) { UINT pow2_w, pow2_h, pow2_d; pow2_w = 1; while (pow2_w < desc->width) pow2_w <<= 1; pow2_h = 1; while (pow2_h < desc->height) pow2_h <<= 1; pow2_d = 1; while (pow2_d < desc->depth) pow2_d <<= 1; if (pow2_w != desc->width || pow2_h != desc->height || pow2_d != desc->depth) { if (desc->pool == WINED3D_POOL_SCRATCH) { WARN("Creating a scratch NPOT volume texture despite lack of HW support.\n"); } else { WARN("Attempted to create a NPOT volume texture (%u, %u, %u) without GL support.\n", desc->width, desc->height, desc->depth); return WINED3DERR_INVALIDCALL; } } } if (FAILED(hr = wined3d_texture_init(texture, &texture3d_ops, 1, levels, desc, device, parent, parent_ops, &texture_resource_ops))) { WARN("Failed to initialize texture, returning %#x.\n", hr); return hr; } texture->pow2_matrix[0] = 1.0f; texture->pow2_matrix[5] = 1.0f; texture->pow2_matrix[10] = 1.0f; texture->pow2_matrix[15] = 1.0f; texture->target = GL_TEXTURE_3D; /* Generate all the surfaces. */ volume_desc = *desc; volume_desc.resource_type = WINED3D_RTYPE_VOLUME; for (i = 0; i < texture->level_count; ++i) { struct wined3d_volume *volume; if (FAILED(hr = wined3d_volume_create(texture, &volume_desc, i, &volume))) { ERR("Creating a volume for the volume texture failed, hr %#x.\n", hr); wined3d_texture_cleanup(texture); return hr; } texture->sub_resources[i] = &volume->resource; /* Calculate the next mipmap level. */ volume_desc.width = max(1, volume_desc.width >> 1); volume_desc.height = max(1, volume_desc.height >> 1); volume_desc.depth = max(1, volume_desc.depth >> 1); } return WINED3D_OK; }