Commit 5b781d70 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

d3d10core: Implement d3d10_device_SOSetTargets().

parent 63acbcbf
...@@ -347,7 +347,24 @@ static void STDMETHODCALLTYPE d3d10_device_OMSetDepthStencilState(ID3D10Device * ...@@ -347,7 +347,24 @@ static void STDMETHODCALLTYPE d3d10_device_OMSetDepthStencilState(ID3D10Device *
static void STDMETHODCALLTYPE d3d10_device_SOSetTargets(ID3D10Device *iface, static void STDMETHODCALLTYPE d3d10_device_SOSetTargets(ID3D10Device *iface,
UINT target_count, ID3D10Buffer *const *targets, const UINT *offsets) UINT target_count, ID3D10Buffer *const *targets, const UINT *offsets)
{ {
FIXME("iface %p, target_count %u, targets %p, offsets %p stub!\n", iface, target_count, targets, offsets); struct d3d10_device *device = impl_from_ID3D10Device(iface);
unsigned int count, i;
TRACE("iface %p, target_count %u, targets %p, offsets %p.\n", iface, target_count, targets, offsets);
count = min(target_count, 4);
for (i = 0; i < count; ++i)
{
struct d3d10_buffer *buffer = unsafe_impl_from_ID3D10Buffer(targets[i]);
wined3d_device_set_stream_output(device->wined3d_device, i,
buffer ? buffer->wined3d_buffer : NULL, offsets[i]);
}
for (i = count; i < 4; ++i)
{
wined3d_device_set_stream_output(device->wined3d_device, i, NULL, 0);
}
} }
static void STDMETHODCALLTYPE d3d10_device_DrawAuto(ID3D10Device *iface) static void STDMETHODCALLTYPE d3d10_device_DrawAuto(ID3D10Device *iface)
......
...@@ -1559,6 +1559,47 @@ UINT CDECL wined3d_device_get_available_texture_mem(const struct wined3d_device ...@@ -1559,6 +1559,47 @@ UINT CDECL wined3d_device_get_available_texture_mem(const struct wined3d_device
return device->adapter->TextureRam - device->adapter->UsedTextureRam; return device->adapter->TextureRam - device->adapter->UsedTextureRam;
} }
void CDECL wined3d_device_set_stream_output(struct wined3d_device *device, UINT idx,
struct wined3d_buffer *buffer, UINT offset)
{
struct wined3d_buffer *prev_buffer;
TRACE("device %p, idx %u, buffer %p, offset %u.\n", device, idx, buffer, offset);
if (idx >= MAX_STREAM_OUT)
{
WARN("Invalid stream output %u.\n", idx);
return;
}
prev_buffer = device->updateStateBlock->state.stream_output[idx].buffer;
device->updateStateBlock->state.stream_output[idx].buffer = buffer;
device->updateStateBlock->state.stream_output[idx].offset = offset;
if (device->isRecordingState)
{
if (buffer)
wined3d_buffer_incref(buffer);
if (prev_buffer)
wined3d_buffer_decref(buffer);
return;
}
if (prev_buffer != buffer)
{
if (buffer)
{
InterlockedIncrement(&buffer->resource.bind_count);
wined3d_buffer_incref(buffer);
}
if (prev_buffer)
{
InterlockedDecrement(&prev_buffer->resource.bind_count);
wined3d_buffer_decref(prev_buffer);
}
}
}
HRESULT CDECL wined3d_device_set_stream_source(struct wined3d_device *device, UINT stream_idx, HRESULT CDECL wined3d_device_set_stream_source(struct wined3d_device *device, UINT stream_idx,
struct wined3d_buffer *buffer, UINT offset, UINT stride) struct wined3d_buffer *buffer, UINT offset, UINT stride)
{ {
......
...@@ -129,6 +129,7 @@ ...@@ -129,6 +129,7 @@
@ cdecl wined3d_device_set_sampler_state(ptr long long long) @ cdecl wined3d_device_set_sampler_state(ptr long long long)
@ cdecl wined3d_device_set_scissor_rect(ptr ptr) @ cdecl wined3d_device_set_scissor_rect(ptr ptr)
@ cdecl wined3d_device_set_software_vertex_processing(ptr long) @ cdecl wined3d_device_set_software_vertex_processing(ptr long)
@ cdecl wined3d_device_set_stream_output(ptr long ptr long)
@ cdecl wined3d_device_set_stream_source(ptr long ptr long long) @ cdecl wined3d_device_set_stream_source(ptr long ptr long long)
@ cdecl wined3d_device_set_stream_source_freq(ptr long long) @ cdecl wined3d_device_set_stream_source_freq(ptr long long)
@ cdecl wined3d_device_set_texture(ptr long ptr) @ cdecl wined3d_device_set_texture(ptr long ptr)
......
...@@ -154,6 +154,7 @@ void wined3d_rb_free(void *ptr) DECLSPEC_HIDDEN; ...@@ -154,6 +154,7 @@ void wined3d_rb_free(void *ptr) DECLSPEC_HIDDEN;
/* Device caps */ /* Device caps */
#define MAX_PALETTES 65536 #define MAX_PALETTES 65536
#define MAX_STREAM_OUT 4
#define MAX_STREAMS 16 #define MAX_STREAMS 16
#define MAX_TEXTURES 8 #define MAX_TEXTURES 8
#define MAX_FRAGMENT_SAMPLERS 16 #define MAX_FRAGMENT_SAMPLERS 16
...@@ -2273,6 +2274,12 @@ struct StageState { ...@@ -2273,6 +2274,12 @@ struct StageState {
DWORD state; DWORD state;
}; };
struct wined3d_stream_output
{
struct wined3d_buffer *buffer;
UINT offset;
};
struct wined3d_stream_state struct wined3d_stream_state
{ {
struct wined3d_buffer *buffer; struct wined3d_buffer *buffer;
...@@ -2287,6 +2294,7 @@ struct wined3d_state ...@@ -2287,6 +2294,7 @@ struct wined3d_state
const struct wined3d_fb_state *fb; const struct wined3d_fb_state *fb;
struct wined3d_vertex_declaration *vertex_declaration; struct wined3d_vertex_declaration *vertex_declaration;
struct wined3d_stream_output stream_output[MAX_STREAM_OUT];
struct wined3d_stream_state streams[MAX_STREAMS + 1 /* tesselated pseudo-stream */]; struct wined3d_stream_state streams[MAX_STREAMS + 1 /* tesselated pseudo-stream */];
BOOL user_stream; BOOL user_stream;
struct wined3d_buffer *index_buffer; struct wined3d_buffer *index_buffer;
......
...@@ -2226,6 +2226,8 @@ void __cdecl wined3d_device_set_sampler_state(struct wined3d_device *device, ...@@ -2226,6 +2226,8 @@ void __cdecl wined3d_device_set_sampler_state(struct wined3d_device *device,
UINT sampler_idx, enum wined3d_sampler_state state, DWORD value); UINT sampler_idx, enum wined3d_sampler_state state, DWORD value);
void __cdecl wined3d_device_set_scissor_rect(struct wined3d_device *device, const RECT *rect); void __cdecl wined3d_device_set_scissor_rect(struct wined3d_device *device, const RECT *rect);
void __cdecl wined3d_device_set_software_vertex_processing(struct wined3d_device *device, BOOL software); void __cdecl wined3d_device_set_software_vertex_processing(struct wined3d_device *device, BOOL software);
void __cdecl wined3d_device_set_stream_output(struct wined3d_device *device, UINT idx,
struct wined3d_buffer *buffer, UINT offset);
HRESULT __cdecl wined3d_device_set_stream_source(struct wined3d_device *device, HRESULT __cdecl wined3d_device_set_stream_source(struct wined3d_device *device,
UINT stream_idx, struct wined3d_buffer *buffer, UINT offset, UINT stride); UINT stream_idx, struct wined3d_buffer *buffer, UINT offset, UINT stride);
HRESULT __cdecl wined3d_device_set_stream_source_freq(struct wined3d_device *device, UINT stream_idx, UINT divider); HRESULT __cdecl wined3d_device_set_stream_source_freq(struct wined3d_device *device, UINT stream_idx, UINT divider);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment