wined3d: Limit number of supported render targets to 8.
Virtually all relatively modern GPUs support 8 render targets. Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7e2e472955
commit
1075b4615b
|
@ -3039,7 +3039,7 @@ static BOOL context_validate_rt_config(UINT rt_count, struct wined3d_rendertarge
|
||||||
BOOL context_apply_clear_state(struct wined3d_context *context, const struct wined3d_state *state,
|
BOOL context_apply_clear_state(struct wined3d_context *context, const struct wined3d_state *state,
|
||||||
UINT rt_count, const struct wined3d_fb_state *fb)
|
UINT rt_count, const struct wined3d_fb_state *fb)
|
||||||
{
|
{
|
||||||
struct wined3d_rendertarget_view **rts = fb->render_targets;
|
struct wined3d_rendertarget_view * const *rts = fb->render_targets;
|
||||||
struct wined3d_rendertarget_view *dsv = fb->depth_stencil;
|
struct wined3d_rendertarget_view *dsv = fb->depth_stencil;
|
||||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||||
DWORD rt_mask = 0, *cur_mask;
|
DWORD rt_mask = 0, *cur_mask;
|
||||||
|
@ -3148,7 +3148,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win
|
||||||
|
|
||||||
static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const struct wined3d_state *state)
|
static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const struct wined3d_state *state)
|
||||||
{
|
{
|
||||||
struct wined3d_rendertarget_view **rts = state->fb->render_targets;
|
struct wined3d_rendertarget_view * const *rts = state->fb->render_targets;
|
||||||
struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL];
|
struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL];
|
||||||
DWORD rt_mask, rt_mask_bits;
|
DWORD rt_mask, rt_mask_bits;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
|
@ -563,17 +563,11 @@ void wined3d_cs_emit_clear_rendertarget_view(struct wined3d_cs *cs, struct wined
|
||||||
const RECT *rect, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil)
|
const RECT *rect, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil)
|
||||||
{
|
{
|
||||||
struct wined3d_cs_clear *op;
|
struct wined3d_cs_clear *op;
|
||||||
struct
|
size_t size;
|
||||||
{
|
|
||||||
struct wined3d_rendertarget_view *rt;
|
|
||||||
struct wined3d_fb_state fb;
|
|
||||||
} *extra;
|
|
||||||
|
|
||||||
op = cs->ops->require_space(cs, FIELD_OFFSET(struct wined3d_cs_clear, rects[1]) + sizeof(*extra),
|
size = FIELD_OFFSET(struct wined3d_cs_clear, rects[1]) + sizeof(struct wined3d_fb_state);
|
||||||
WINED3D_CS_QUEUE_DEFAULT);
|
op = cs->ops->require_space(cs, size, WINED3D_CS_QUEUE_DEFAULT);
|
||||||
extra = (void *)&op->rects[1];
|
op->fb = (void *)&op->rects[1];
|
||||||
extra->fb.render_targets = &extra->rt;
|
|
||||||
op->fb = &extra->fb;
|
|
||||||
|
|
||||||
op->opcode = WINED3D_CS_OP_CLEAR;
|
op->opcode = WINED3D_CS_OP_CLEAR;
|
||||||
op->flags = flags;
|
op->flags = flags;
|
||||||
|
@ -994,7 +988,7 @@ static void wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const v
|
||||||
{
|
{
|
||||||
const struct wined3d_cs_set_rendertarget_view *op = data;
|
const struct wined3d_cs_set_rendertarget_view *op = data;
|
||||||
|
|
||||||
cs->state.fb->render_targets[op->view_idx] = op->view;
|
cs->fb.render_targets[op->view_idx] = op->view;
|
||||||
device_invalidate_state(cs->device, STATE_FRAMEBUFFER);
|
device_invalidate_state(cs->device, STATE_FRAMEBUFFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2734,12 +2728,6 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device)
|
||||||
cs->ops = &wined3d_cs_st_ops;
|
cs->ops = &wined3d_cs_st_ops;
|
||||||
cs->device = device;
|
cs->device = device;
|
||||||
|
|
||||||
if (!(cs->fb.render_targets = heap_calloc(gl_info->limits.buffers, sizeof(*cs->fb.render_targets))))
|
|
||||||
{
|
|
||||||
heap_free(cs);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
state_init(&cs->state, &cs->fb, gl_info, &device->adapter->d3d_info,
|
state_init(&cs->state, &cs->fb, gl_info, &device->adapter->d3d_info,
|
||||||
WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT);
|
WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT);
|
||||||
|
|
||||||
|
@ -2782,7 +2770,6 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device)
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
state_cleanup(&cs->state);
|
state_cleanup(&cs->state);
|
||||||
heap_free(cs->fb.render_targets);
|
|
||||||
heap_free(cs);
|
heap_free(cs);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2798,7 +2785,6 @@ void wined3d_cs_destroy(struct wined3d_cs *cs)
|
||||||
}
|
}
|
||||||
|
|
||||||
state_cleanup(&cs->state);
|
state_cleanup(&cs->state);
|
||||||
heap_free(cs->fb.render_targets);
|
|
||||||
heap_free(cs->data);
|
heap_free(cs->data);
|
||||||
heap_free(cs);
|
heap_free(cs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1050,7 +1050,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
|
||||||
struct wined3d_swapchain_desc *swapchain_desc)
|
struct wined3d_swapchain_desc *swapchain_desc)
|
||||||
{
|
{
|
||||||
static const struct wined3d_color black = {0.0f, 0.0f, 0.0f, 0.0f};
|
static const struct wined3d_color black = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
|
||||||
struct wined3d_swapchain *swapchain = NULL;
|
struct wined3d_swapchain *swapchain = NULL;
|
||||||
DWORD clear_flags = 0;
|
DWORD clear_flags = 0;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -1062,16 +1061,14 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
|
||||||
if (device->wined3d->flags & WINED3D_NO3D)
|
if (device->wined3d->flags & WINED3D_NO3D)
|
||||||
return WINED3DERR_INVALIDCALL;
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
|
||||||
if (!(device->fb.render_targets = heap_calloc(gl_info->limits.buffers, sizeof(*device->fb.render_targets))))
|
memset(device->fb.render_targets, 0, sizeof(device->fb.render_targets));
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
/* Setup the implicit swapchain. This also initializes a context. */
|
/* Setup the implicit swapchain. This also initializes a context. */
|
||||||
TRACE("Creating implicit swapchain\n");
|
TRACE("Creating implicit swapchain.\n");
|
||||||
hr = device->device_parent->ops->create_swapchain(device->device_parent,
|
if (FAILED(hr = device->device_parent->ops->create_swapchain(device->device_parent,
|
||||||
swapchain_desc, &swapchain);
|
swapchain_desc, &swapchain)))
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
{
|
||||||
WARN("Failed to create implicit swapchain\n");
|
WARN("Failed to create implicit swapchain.\n");
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1108,7 +1105,7 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
|
||||||
|
|
||||||
device->contexts[0]->last_was_rhw = 0;
|
device->contexts[0]->last_was_rhw = 0;
|
||||||
|
|
||||||
TRACE("All defaults now set up, leaving 3D init.\n");
|
TRACE("All defaults now set up.\n");
|
||||||
|
|
||||||
/* Clear the screen */
|
/* Clear the screen */
|
||||||
if (swapchain->back_buffers && swapchain->back_buffers[0])
|
if (swapchain->back_buffers && swapchain->back_buffers[0])
|
||||||
|
@ -1131,7 +1128,6 @@ err_out:
|
||||||
wined3d_rendertarget_view_decref(device->back_buffer_view);
|
wined3d_rendertarget_view_decref(device->back_buffer_view);
|
||||||
if (swapchain)
|
if (swapchain)
|
||||||
wined3d_swapchain_decref(swapchain);
|
wined3d_swapchain_decref(swapchain);
|
||||||
heap_free(device->fb.render_targets);
|
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -1186,7 +1182,7 @@ static void device_free_sampler(struct wine_rb_entry *entry, void *context)
|
||||||
|
|
||||||
HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device)
|
HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device)
|
||||||
{
|
{
|
||||||
UINT i;
|
unsigned int i;
|
||||||
|
|
||||||
TRACE("device %p.\n", device);
|
TRACE("device %p.\n", device);
|
||||||
|
|
||||||
|
@ -1246,9 +1242,6 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device)
|
||||||
device->swapchains = NULL;
|
device->swapchains = NULL;
|
||||||
device->swapchain_count = 0;
|
device->swapchain_count = 0;
|
||||||
|
|
||||||
heap_free(device->fb.render_targets);
|
|
||||||
device->fb.render_targets = NULL;
|
|
||||||
|
|
||||||
device->d3d_initialized = FALSE;
|
device->d3d_initialized = FALSE;
|
||||||
|
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
|
@ -4758,12 +4751,9 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
|
||||||
state_unbind_resources(&device->state);
|
state_unbind_resources(&device->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device->fb.render_targets)
|
for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i)
|
||||||
{
|
{
|
||||||
for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i)
|
wined3d_device_set_rendertarget_view(device, i, NULL, FALSE);
|
||||||
{
|
|
||||||
wined3d_device_set_rendertarget_view(device, i, NULL, FALSE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
wined3d_device_set_depth_stencil_view(device, NULL);
|
wined3d_device_set_depth_stencil_view(device, NULL);
|
||||||
|
|
||||||
|
|
|
@ -3521,7 +3521,7 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
|
||||||
if (gl_info->supported[ARB_DRAW_BUFFERS] && wined3d_settings.offscreen_rendering_mode == ORM_FBO)
|
if (gl_info->supported[ARB_DRAW_BUFFERS] && wined3d_settings.offscreen_rendering_mode == ORM_FBO)
|
||||||
{
|
{
|
||||||
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
|
gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
|
||||||
gl_info->limits.buffers = gl_max;
|
gl_info->limits.buffers = min(MAX_RENDER_TARGET_VIEWS, gl_max);
|
||||||
TRACE("Max draw buffers: %u.\n", gl_max);
|
TRACE("Max draw buffers: %u.\n", gl_max);
|
||||||
}
|
}
|
||||||
if (gl_info->supported[ARB_MULTITEXTURE])
|
if (gl_info->supported[ARB_MULTITEXTURE])
|
||||||
|
|
|
@ -271,6 +271,7 @@ static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup
|
||||||
#define MAX_CONSTANT_BUFFERS 15
|
#define MAX_CONSTANT_BUFFERS 15
|
||||||
#define MAX_SAMPLER_OBJECTS 16
|
#define MAX_SAMPLER_OBJECTS 16
|
||||||
#define MAX_SHADER_RESOURCE_VIEWS 128
|
#define MAX_SHADER_RESOURCE_VIEWS 128
|
||||||
|
#define MAX_RENDER_TARGET_VIEWS 8
|
||||||
#define MAX_UNORDERED_ACCESS_VIEWS 8
|
#define MAX_UNORDERED_ACCESS_VIEWS 8
|
||||||
#define MAX_TGSM_REGISTERS 8192
|
#define MAX_TGSM_REGISTERS 8192
|
||||||
#define MAX_VERTEX_BLENDS 4
|
#define MAX_VERTEX_BLENDS 4
|
||||||
|
@ -1993,7 +1994,7 @@ struct wined3d_context
|
||||||
|
|
||||||
struct wined3d_fb_state
|
struct wined3d_fb_state
|
||||||
{
|
{
|
||||||
struct wined3d_rendertarget_view **render_targets;
|
struct wined3d_rendertarget_view *render_targets[MAX_RENDER_TARGET_VIEWS];
|
||||||
struct wined3d_rendertarget_view *depth_stencil;
|
struct wined3d_rendertarget_view *depth_stencil;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue