d3d10core: Implement d3d10_device_VSSetSamplers().

This commit is contained in:
Henri Verbeet 2012-12-05 21:01:47 +01:00 committed by Alexandre Julliard
parent 71db6fd285
commit e5805c316c
10 changed files with 165 additions and 1 deletions

View File

@ -246,9 +246,12 @@ struct d3d10_sampler_state
{ {
ID3D10SamplerState ID3D10SamplerState_iface; ID3D10SamplerState ID3D10SamplerState_iface;
LONG refcount; LONG refcount;
struct wined3d_sampler *wined3d_sampler;
}; };
HRESULT d3d10_sampler_state_init(struct d3d10_sampler_state *state) DECLSPEC_HIDDEN; HRESULT d3d10_sampler_state_init(struct d3d10_sampler_state *state) DECLSPEC_HIDDEN;
struct d3d10_sampler_state *unsafe_impl_from_ID3D10SamplerState(ID3D10SamplerState *iface) DECLSPEC_HIDDEN;
/* ID3D10Query */ /* ID3D10Query */
struct d3d10_query struct d3d10_query

View File

@ -327,8 +327,19 @@ static void STDMETHODCALLTYPE d3d10_device_VSSetShaderResources(ID3D10Device *if
static void STDMETHODCALLTYPE d3d10_device_VSSetSamplers(ID3D10Device *iface, static void STDMETHODCALLTYPE d3d10_device_VSSetSamplers(ID3D10Device *iface,
UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers) UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers)
{ {
FIXME("iface %p, start_slot %u, sampler_count %u, samplers %p stub!\n", struct d3d10_device *device = impl_from_ID3D10Device(iface);
unsigned int i;
TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n",
iface, start_slot, sampler_count, samplers); iface, start_slot, sampler_count, samplers);
for (i = 0; i < sampler_count; ++i)
{
struct d3d10_sampler_state *sampler = unsafe_impl_from_ID3D10SamplerState(samplers[i]);
wined3d_device_set_vs_sampler(device->wined3d_device, start_slot + i,
sampler ? sampler->wined3d_sampler : NULL);
}
} }
static void STDMETHODCALLTYPE d3d10_device_SetPredication(ID3D10Device *iface, ID3D10Predicate *predicate, BOOL value) static void STDMETHODCALLTYPE d3d10_device_SetPredication(ID3D10Device *iface, ID3D10Predicate *predicate, BOOL value)

View File

@ -445,6 +445,7 @@ static ULONG STDMETHODCALLTYPE d3d10_sampler_state_Release(ID3D10SamplerState *i
if (!refcount) if (!refcount)
{ {
wined3d_sampler_decref(This->wined3d_sampler);
HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, This);
} }
@ -509,8 +510,25 @@ static const struct ID3D10SamplerStateVtbl d3d10_sampler_state_vtbl =
HRESULT d3d10_sampler_state_init(struct d3d10_sampler_state *state) HRESULT d3d10_sampler_state_init(struct d3d10_sampler_state *state)
{ {
HRESULT hr;
state->ID3D10SamplerState_iface.lpVtbl = &d3d10_sampler_state_vtbl; state->ID3D10SamplerState_iface.lpVtbl = &d3d10_sampler_state_vtbl;
state->refcount = 1; state->refcount = 1;
if (FAILED(hr = wined3d_sampler_create(state, &state->wined3d_sampler)))
{
WARN("Failed to create wined3d sampler, hr %#x.\n", hr);
return hr;
}
return S_OK; return S_OK;
} }
struct d3d10_sampler_state *unsafe_impl_from_ID3D10SamplerState(ID3D10SamplerState *iface)
{
if (!iface)
return NULL;
assert(iface->lpVtbl == &d3d10_sampler_state_vtbl);
return impl_from_ID3D10SamplerState(iface);
}

View File

@ -16,6 +16,7 @@ C_SRCS = \
palette.c \ palette.c \
query.c \ query.c \
resource.c \ resource.c \
sampler.c \
shader.c \ shader.c \
shader_sm1.c \ shader_sm1.c \
shader_sm4.c \ shader_sm4.c \

View File

@ -2584,6 +2584,27 @@ struct wined3d_buffer * CDECL wined3d_device_get_vs_cb(const struct wined3d_devi
return device->stateBlock->state.vs_cb[idx]; return device->stateBlock->state.vs_cb[idx];
} }
void CDECL wined3d_device_set_vs_sampler(struct wined3d_device *device, UINT idx, struct wined3d_sampler *sampler)
{
struct wined3d_sampler *prev;
TRACE("device %p, idx %u, sampler %p.\n", device, idx, sampler);
if (idx >= MAX_SAMPLER_OBJECTS)
{
WARN("Invalid sampler index %u.\n", idx);
return;
}
prev = device->updateStateBlock->state.vs_sampler[idx];
device->updateStateBlock->state.vs_sampler[idx] = sampler;
if (sampler)
wined3d_sampler_incref(sampler);
if (prev)
wined3d_sampler_decref(prev);
}
HRESULT CDECL wined3d_device_set_vs_consts_b(struct wined3d_device *device, HRESULT CDECL wined3d_device_set_vs_consts_b(struct wined3d_device *device,
UINT start_register, const BOOL *constants, UINT bool_count) UINT start_register, const BOOL *constants, UINT bool_count)
{ {

79
dlls/wined3d/sampler.c Normal file
View File

@ -0,0 +1,79 @@
/*
* Copyright 2012 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
*
*/
#include "config.h"
#include "wine/port.h"
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
ULONG CDECL wined3d_sampler_incref(struct wined3d_sampler *sampler)
{
ULONG refcount = InterlockedIncrement(&sampler->refcount);
TRACE("%p increasing refcount to %u.\n", sampler, refcount);
return refcount;
}
ULONG CDECL wined3d_sampler_decref(struct wined3d_sampler *sampler)
{
ULONG refcount = InterlockedDecrement(&sampler->refcount);
TRACE("%p decreasing refcount to %u.\n", sampler, refcount);
if (!refcount)
HeapFree(GetProcessHeap(), 0, sampler);
return refcount;
}
void * CDECL wined3d_sampler_get_parent(const struct wined3d_sampler *sampler)
{
TRACE("sampler %p.\n", sampler);
return sampler->parent;
}
static void wined3d_sampler_init(struct wined3d_sampler *sampler, void *parent)
{
sampler->refcount = 1;
sampler->parent = parent;
}
HRESULT CDECL wined3d_sampler_create(void *parent, struct wined3d_sampler **sampler)
{
struct wined3d_sampler *object;
TRACE("parent %p, sampler %p.\n", parent, sampler);
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
{
ERR("Failed to allocate memory.\n");
return E_OUTOFMEMORY;
}
wined3d_sampler_init(object, parent);
TRACE("Created sampler %p.\n", object);
*sampler = object;
return WINED3D_OK;
}

View File

@ -471,6 +471,7 @@ void stateblock_unbind_resources(struct wined3d_stateblock *stateblock)
{ {
struct wined3d_state *state = &stateblock->state; struct wined3d_state *state = &stateblock->state;
struct wined3d_vertex_declaration *decl; struct wined3d_vertex_declaration *decl;
struct wined3d_sampler *sampler;
struct wined3d_texture *texture; struct wined3d_texture *texture;
struct wined3d_buffer *buffer; struct wined3d_buffer *buffer;
struct wined3d_shader *shader; struct wined3d_shader *shader;
@ -530,6 +531,15 @@ void stateblock_unbind_resources(struct wined3d_stateblock *stateblock)
} }
} }
for (i = 0; i < MAX_SAMPLER_OBJECTS; ++i)
{
if ((sampler = state->vs_sampler[i]))
{
state->vs_sampler[i] = NULL;
wined3d_sampler_decref(sampler);
}
}
if ((shader = state->geometry_shader)) if ((shader = state->geometry_shader))
{ {
state->geometry_shader = NULL; state->geometry_shader = NULL;

View File

@ -149,6 +149,7 @@
@ cdecl wined3d_device_set_vs_consts_b(ptr long ptr long) @ cdecl wined3d_device_set_vs_consts_b(ptr long ptr long)
@ cdecl wined3d_device_set_vs_consts_f(ptr long ptr long) @ cdecl wined3d_device_set_vs_consts_f(ptr long ptr long)
@ cdecl wined3d_device_set_vs_consts_i(ptr long ptr long) @ cdecl wined3d_device_set_vs_consts_i(ptr long ptr long)
@ cdecl wined3d_device_set_vs_sampler(ptr long ptr);
@ cdecl wined3d_device_setup_fullscreen_window(ptr ptr long long) @ cdecl wined3d_device_setup_fullscreen_window(ptr ptr long long)
@ cdecl wined3d_device_show_cursor(ptr long) @ cdecl wined3d_device_show_cursor(ptr long)
@ cdecl wined3d_device_uninit_3d(ptr) @ cdecl wined3d_device_uninit_3d(ptr)
@ -185,6 +186,11 @@
@ cdecl wined3d_rendertarget_view_get_resource(ptr) @ cdecl wined3d_rendertarget_view_get_resource(ptr)
@ cdecl wined3d_rendertarget_view_incref(ptr) @ cdecl wined3d_rendertarget_view_incref(ptr)
@ cdecl wined3d_sampler_create(ptr ptr)
@ cdecl wined3d_sampler_decref(ptr)
@ cdecl wined3d_sampler_get_parent(ptr)
@ cdecl wined3d_sampler_incref(ptr)
@ cdecl wined3d_shader_create_gs(ptr ptr ptr ptr ptr ptr long) @ cdecl wined3d_shader_create_gs(ptr ptr ptr ptr ptr ptr long)
@ cdecl wined3d_shader_create_ps(ptr ptr ptr ptr ptr ptr long) @ cdecl wined3d_shader_create_ps(ptr ptr ptr ptr ptr ptr long)
@ cdecl wined3d_shader_create_vs(ptr ptr ptr ptr ptr ptr long) @ cdecl wined3d_shader_create_vs(ptr ptr ptr ptr ptr ptr long)

View File

@ -163,6 +163,7 @@ void wined3d_rb_free(void *ptr) DECLSPEC_HIDDEN;
#define MAX_ACTIVE_LIGHTS 8 #define MAX_ACTIVE_LIGHTS 8
#define MAX_CLIPPLANES WINED3DMAXUSERCLIPPLANES #define MAX_CLIPPLANES WINED3DMAXUSERCLIPPLANES
#define MAX_CONSTANT_BUFFERS 15 #define MAX_CONSTANT_BUFFERS 15
#define MAX_SAMPLER_OBJECTS 16
struct min_lookup struct min_lookup
{ {
@ -2210,6 +2211,12 @@ enum wined3d_conversion_type
void d3dfmt_p8_init_palette(const struct wined3d_surface *surface, BYTE table[256][4], BOOL colorkey) DECLSPEC_HIDDEN; void d3dfmt_p8_init_palette(const struct wined3d_surface *surface, BYTE table[256][4], BOOL colorkey) DECLSPEC_HIDDEN;
struct wined3d_sampler
{
LONG refcount;
void *parent;
};
struct wined3d_vertex_declaration_element struct wined3d_vertex_declaration_element
{ {
const struct wined3d_format *format; const struct wined3d_format *format;
@ -2301,6 +2308,7 @@ struct wined3d_state
struct wined3d_shader *vertex_shader; struct wined3d_shader *vertex_shader;
struct wined3d_buffer *vs_cb[MAX_CONSTANT_BUFFERS]; struct wined3d_buffer *vs_cb[MAX_CONSTANT_BUFFERS];
struct wined3d_sampler *vs_sampler[MAX_SAMPLER_OBJECTS];
BOOL vs_consts_b[MAX_CONST_B]; BOOL vs_consts_b[MAX_CONST_B];
INT vs_consts_i[MAX_CONST_I * 4]; INT vs_consts_i[MAX_CONST_I * 4];
float *vs_consts_f; float *vs_consts_f;

View File

@ -1981,6 +1981,7 @@ struct wined3d_palette;
struct wined3d_query; struct wined3d_query;
struct wined3d_rendertarget_view; struct wined3d_rendertarget_view;
struct wined3d_resource; struct wined3d_resource;
struct wined3d_sampler;
struct wined3d_shader; struct wined3d_shader;
struct wined3d_stateblock; struct wined3d_stateblock;
struct wined3d_surface; struct wined3d_surface;
@ -2256,6 +2257,7 @@ HRESULT __cdecl wined3d_device_set_vs_consts_f(struct wined3d_device *device,
UINT start_register, const float *constants, UINT vector4f_count); UINT start_register, const float *constants, UINT vector4f_count);
HRESULT __cdecl wined3d_device_set_vs_consts_i(struct wined3d_device *device, HRESULT __cdecl wined3d_device_set_vs_consts_i(struct wined3d_device *device,
UINT start_register, const int *constants, UINT vector4i_count); UINT start_register, const int *constants, UINT vector4i_count);
void __cdecl wined3d_device_set_vs_sampler(struct wined3d_device *device, UINT idx, struct wined3d_sampler *sampler);
void __cdecl wined3d_device_setup_fullscreen_window(struct wined3d_device *device, HWND window, UINT w, UINT h); void __cdecl wined3d_device_setup_fullscreen_window(struct wined3d_device *device, HWND window, UINT w, UINT h);
BOOL __cdecl wined3d_device_show_cursor(struct wined3d_device *device, BOOL show); BOOL __cdecl wined3d_device_show_cursor(struct wined3d_device *device, BOOL show);
HRESULT __cdecl wined3d_device_uninit_3d(struct wined3d_device *device); HRESULT __cdecl wined3d_device_uninit_3d(struct wined3d_device *device);
@ -2302,6 +2304,11 @@ void * __cdecl wined3d_rendertarget_view_get_parent(const struct wined3d_rendert
struct wined3d_resource * __cdecl wined3d_rendertarget_view_get_resource(const struct wined3d_rendertarget_view *view); struct wined3d_resource * __cdecl wined3d_rendertarget_view_get_resource(const struct wined3d_rendertarget_view *view);
ULONG __cdecl wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view); ULONG __cdecl wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view);
HRESULT __cdecl wined3d_sampler_create(void *parent, struct wined3d_sampler **sampler);
ULONG __cdecl wined3d_sampler_decref(struct wined3d_sampler *sampler);
void * __cdecl wined3d_sampler_get_parent(const struct wined3d_sampler *sampler);
ULONG __cdecl wined3d_sampler_incref(struct wined3d_sampler *sampler);
HRESULT __cdecl wined3d_shader_create_gs(struct wined3d_device *device, const DWORD *byte_code, HRESULT __cdecl wined3d_shader_create_gs(struct wined3d_device *device, const DWORD *byte_code,
const struct wined3d_shader_signature *output_signature, void *parent, const struct wined3d_shader_signature *output_signature, void *parent,
const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader, unsigned int max_version); const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader, unsigned int max_version);