HRESULT d3d10_sampler_state_init(struct d3d10_sampler_state *state, struct d3d10_device *device, const D3D10_SAMPLER_DESC *desc) { HRESULT hr; state->ID3D10SamplerState_iface.lpVtbl = &d3d10_sampler_state_vtbl; state->refcount = 1; state->desc = *desc; if (FAILED(hr = wined3d_sampler_create(state, &state->wined3d_sampler))) { WARN("Failed to create wined3d sampler, hr %#x.\n", hr); return hr; } if (wine_rb_put(&device->sampler_states, desc, &state->entry) == -1) { ERR("Failed to insert sampler state entry.\n"); wined3d_sampler_decref(state->wined3d_sampler); return E_FAIL; } state->device = &device->ID3D10Device1_iface; ID3D10Device1_AddRef(state->device); return S_OK; }
HRESULT d3d_sampler_state_init(struct d3d_sampler_state *state, struct d3d_device *device, const D3D11_SAMPLER_DESC *desc) { struct wined3d_sampler_desc wined3d_desc; HRESULT hr; state->ID3D11SamplerState_iface.lpVtbl = &d3d11_sampler_state_vtbl; state->ID3D10SamplerState_iface.lpVtbl = &d3d10_sampler_state_vtbl; state->refcount = 1; wined3d_mutex_lock(); wined3d_private_store_init(&state->private_store); state->desc = *desc; wined3d_desc.address_u = wined3d_texture_address_from_d3d11(desc->AddressU); wined3d_desc.address_v = wined3d_texture_address_from_d3d11(desc->AddressV); wined3d_desc.address_w = wined3d_texture_address_from_d3d11(desc->AddressW); memcpy(wined3d_desc.border_color, desc->BorderColor, sizeof(wined3d_desc.border_color)); wined3d_desc.mag_filter = wined3d_texture_filter_mag_from_d3d11(desc->Filter); wined3d_desc.min_filter = wined3d_texture_filter_min_from_d3d11(desc->Filter); wined3d_desc.mip_filter = wined3d_texture_filter_mip_from_d3d11(desc->Filter); wined3d_desc.lod_bias = desc->MipLODBias; wined3d_desc.min_lod = desc->MinLOD; wined3d_desc.max_lod = desc->MaxLOD; wined3d_desc.max_anisotropy = D3D11_DECODE_IS_ANISOTROPIC_FILTER(desc->Filter) ? desc->MaxAnisotropy : 1; wined3d_desc.compare = wined3d_texture_compare_from_d3d11(desc->Filter); wined3d_desc.comparison_func = wined3d_cmp_func_from_d3d11(desc->ComparisonFunc); wined3d_desc.srgb_decode = FALSE; if (FAILED(hr = wined3d_sampler_create(device->wined3d_device, &wined3d_desc, state, &state->wined3d_sampler))) { WARN("Failed to create wined3d sampler, hr %#x.\n", hr); wined3d_private_store_cleanup(&state->private_store); wined3d_mutex_unlock(); return hr; } if (wine_rb_put(&device->sampler_states, desc, &state->entry) == -1) { ERR("Failed to insert sampler state entry.\n"); wined3d_sampler_decref(state->wined3d_sampler); wined3d_private_store_cleanup(&state->private_store); wined3d_mutex_unlock(); return E_FAIL; } wined3d_mutex_unlock(); state->device = &device->ID3D11Device_iface; ID3D11Device_AddRef(state->device); return S_OK; }