[PATCH 4/4] wined3d: Move the sample mask state out of the render state array.
Chip Davis
cdavis at codeweavers.com
Mon Apr 20 00:53:02 CDT 2020
Signed-off-by: Chip Davis <cdavis at codeweavers.com>
---
dlls/d3d11/device.c | 8 +++-----
dlls/wined3d/cs.c | 6 +++++-
dlls/wined3d/device.c | 27 +++++++++++++++++----------
dlls/wined3d/state.c | 18 +++++++++---------
dlls/wined3d/utils.c | 2 ++
dlls/wined3d/wined3d_private.h | 8 ++++++--
include/wine/wined3d.h | 4 ++--
7 files changed, 44 insertions(+), 29 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 7c75431780c..23d05e08b49 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -715,13 +715,12 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetBlendState(ID3D11Devi
blend_factor = default_blend_factor;
wined3d_mutex_lock();
- wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_MULTISAMPLEMASK, sample_mask);
if (!(blend_state_impl = unsafe_impl_from_ID3D11BlendState(blend_state)))
wined3d_device_set_blend_state(device->wined3d_device, NULL,
- (const struct wined3d_color *)blend_factor);
+ (const struct wined3d_color *)blend_factor, sample_mask);
else
wined3d_device_set_blend_state(device->wined3d_device, blend_state_impl->wined3d_state,
- (const struct wined3d_color *)blend_factor);
+ (const struct wined3d_color *)blend_factor, sample_mask);
wined3d_mutex_unlock();
}
@@ -1877,7 +1876,7 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMGetBlendState(ID3D11Devi
wined3d_mutex_lock();
if ((wined3d_state = wined3d_device_get_blend_state(device->wined3d_device,
- (struct wined3d_color *)blend_factor)))
+ (struct wined3d_color *)blend_factor, sample_mask)))
{
blend_state_impl = wined3d_blend_state_get_parent(wined3d_state);
ID3D11BlendState_AddRef(*blend_state = &blend_state_impl->ID3D11BlendState_iface);
@@ -1886,7 +1885,6 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMGetBlendState(ID3D11Devi
{
*blend_state = NULL;
}
- *sample_mask = wined3d_device_get_render_state(device->wined3d_device, WINED3D_RS_MULTISAMPLEMASK);
wined3d_mutex_unlock();
}
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 899d5a712e4..943ffe9af62 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -265,6 +265,7 @@ struct wined3d_cs_set_blend_state
enum wined3d_cs_op opcode;
struct wined3d_blend_state *state;
struct wined3d_color factor;
+ unsigned int sample_mask;
};
struct wined3d_cs_set_rasterizer_state
@@ -1565,11 +1566,13 @@ static void wined3d_cs_exec_set_blend_state(struct wined3d_cs *cs, const void *d
device_invalidate_state(cs->device, STATE_BLEND);
}
state->blend_factor = op->factor;
+ state->sample_mask = op->sample_mask;
device_invalidate_state(cs->device, STATE_BLEND_FACTOR);
+ device_invalidate_state(cs->device, STATE_SAMPLE_MASK);
}
void wined3d_cs_emit_set_blend_state(struct wined3d_cs *cs, struct wined3d_blend_state *state,
- const struct wined3d_color *blend_factor)
+ const struct wined3d_color *blend_factor, unsigned int sample_mask)
{
struct wined3d_cs_set_blend_state *op;
@@ -1577,6 +1580,7 @@ void wined3d_cs_emit_set_blend_state(struct wined3d_cs *cs, struct wined3d_blend
op->opcode = WINED3D_CS_OP_SET_BLEND_STATE;
op->state = state;
op->factor = *blend_factor;
+ op->sample_mask = sample_mask;
wined3d_cs_submit(cs, WINED3D_CS_QUEUE_DEFAULT);
}
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8baf9b9df19..4c60c140784 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1678,34 +1678,38 @@ static void resolve_depth_buffer(struct wined3d_device *device)
}
void CDECL wined3d_device_set_blend_state(struct wined3d_device *device,
- struct wined3d_blend_state *blend_state, const struct wined3d_color *blend_factor)
+ struct wined3d_blend_state *blend_state, const struct wined3d_color *blend_factor, unsigned int sample_mask)
{
struct wined3d_state *state = &device->state;
struct wined3d_blend_state *prev;
- TRACE("device %p, blend_state %p, blend_factor %s.\n", device, blend_state, debug_color(blend_factor));
+ TRACE("device %p, blend_state %p, blend_factor %s, sample_mask 0x%08x.\n", device, blend_state,
+ debug_color(blend_factor), sample_mask);
prev = state->blend_state;
- if (prev == blend_state && !memcmp(blend_factor, &state->blend_factor, sizeof(*blend_factor)))
+ if (prev == blend_state && !memcmp(blend_factor, &state->blend_factor, sizeof(*blend_factor))
+ && sample_mask == state->sample_mask)
return;
if (blend_state)
wined3d_blend_state_incref(blend_state);
state->blend_state = blend_state;
state->blend_factor = *blend_factor;
- wined3d_cs_emit_set_blend_state(device->cs, blend_state, blend_factor);
+ state->sample_mask = sample_mask;
+ wined3d_cs_emit_set_blend_state(device->cs, blend_state, blend_factor, sample_mask);
if (prev)
wined3d_blend_state_decref(prev);
}
struct wined3d_blend_state * CDECL wined3d_device_get_blend_state(const struct wined3d_device *device,
- struct wined3d_color *blend_factor)
+ struct wined3d_color *blend_factor, unsigned int *sample_mask)
{
const struct wined3d_state *state = &device->state;
- TRACE("device %p, blend_factor %p.\n", device, blend_factor);
+ TRACE("device %p, blend_factor %p, sample_mask %p.\n", device, blend_factor, sample_mask);
*blend_factor = state->blend_factor;
+ *sample_mask = state->sample_mask;
return state->blend_state;
}
@@ -3588,6 +3592,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
switch (idx)
{
case WINED3D_RS_BLENDFACTOR:
+ case WINED3D_RS_MULTISAMPLEMASK:
case WINED3D_RS_ALPHABLENDENABLE:
case WINED3D_RS_SRCBLEND:
case WINED3D_RS_DESTBLEND:
@@ -3667,6 +3672,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
struct wined3d_blend_state_desc desc;
struct wine_rb_entry *entry;
struct wined3d_color colour;
+ unsigned int sample_mask;
memset(&desc, 0, sizeof(desc));
desc.alpha_to_coverage = state->alpha_to_coverage;
@@ -3710,20 +3716,21 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
}
}
+ wined3d_device_get_blend_state(device, &colour, &sample_mask);
if (wined3d_bitmap_is_set(changed->renderState, WINED3D_RS_BLENDFACTOR))
wined3d_color_from_d3dcolor(&colour, state->rs[WINED3D_RS_BLENDFACTOR]);
- else
- wined3d_device_get_blend_state(device, &colour);
+ if (wined3d_bitmap_is_set(changed->renderState, WINED3D_RS_MULTISAMPLEMASK))
+ sample_mask = state->rs[WINED3D_RS_MULTISAMPLEMASK];
if ((entry = wine_rb_get(&device->blend_states, &desc)))
{
blend_state = WINE_RB_ENTRY_VALUE(entry, struct wined3d_blend_state, entry);
- wined3d_device_set_blend_state(device, blend_state, &colour);
+ wined3d_device_set_blend_state(device, blend_state, &colour, sample_mask);
}
else if (SUCCEEDED(wined3d_blend_state_create(device, &desc, NULL,
&wined3d_null_parent_ops, &blend_state)))
{
- wined3d_device_set_blend_state(device, blend_state, &colour);
+ wined3d_device_set_blend_state(device, blend_state, &colour, sample_mask);
if (wine_rb_put(&device->blend_states, &desc, &blend_state->entry) == -1)
{
ERR("Failed to insert blend state.\n");
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index d7792f46168..42666e9ccc2 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -552,6 +552,12 @@ static void state_blend_factor(struct wined3d_context *context, const struct win
checkGLcall("glBlendColor");
}
+static void state_multisampmask(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
+{
+ if (state->sample_mask != 0xffffffff)
+ FIXME("Sample mask %#x not yet implemented.\n", state->sample_mask);
+}
+
static BOOL is_blend_enabled(struct wined3d_context *context, const struct wined3d_state *state, UINT index)
{
const struct wined3d_blend_state *b = state->blend_state;
@@ -1901,13 +1907,6 @@ static void state_antialias(struct wined3d_context *context, const struct wined3
FIXME("Antialias not supported yet.\n");
}
-static void state_multisampmask(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
-{
- if (state->render_states[WINED3D_RS_MULTISAMPLEMASK] != 0xffffffff)
- FIXME("WINED3D_RS_MULTISAMPLEMASK %#x not yet implemented.\n",
- state->render_states[WINED3D_RS_MULTISAMPLEMASK]);
-}
-
static void state_patchedgestyle(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
if (state->render_states[WINED3D_RS_PATCHEDGESTYLE] != WINED3D_PATCH_EDGE_DISCRETE)
@@ -4603,6 +4602,7 @@ const struct wined3d_state_entry_template misc_state_template[] =
{ STATE_BLEND, { STATE_BLEND, blend }, WINED3D_GL_EXT_NONE },
{ STATE_BLEND_FACTOR, { STATE_BLEND_FACTOR, state_blend_factor }, EXT_BLEND_COLOR },
{ STATE_BLEND_FACTOR, { STATE_BLEND_FACTOR, state_blend_factor_w}, WINED3D_GL_EXT_NONE },
+ { STATE_SAMPLE_MASK, { STATE_SAMPLE_MASK, state_multisampmask }, WINED3D_GL_EXT_NONE },
{ STATE_STREAMSRC, { STATE_STREAMSRC, streamsrc }, WINED3D_GL_EXT_NONE },
{ STATE_VDECL, { STATE_VDECL, vdecl_miscpart }, WINED3D_GL_EXT_NONE },
{ STATE_RASTERIZER, { STATE_RASTERIZER, rasterizer_cc }, ARB_CLIP_CONTROL },
@@ -4735,7 +4735,6 @@ const struct wined3d_state_entry_template misc_state_template[] =
{ STATE_RENDER(WINED3D_RS_ADAPTIVETESS_W), { STATE_RENDER(WINED3D_RS_ENABLEADAPTIVETESSELLATION),NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3D_RS_ENABLEADAPTIVETESSELLATION),{ STATE_RENDER(WINED3D_RS_ENABLEADAPTIVETESSELLATION),state_nvdb }, EXT_DEPTH_BOUNDS_TEST },
{ STATE_RENDER(WINED3D_RS_ENABLEADAPTIVETESSELLATION),{ STATE_RENDER(WINED3D_RS_ENABLEADAPTIVETESSELLATION),state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3D_RS_MULTISAMPLEMASK), { STATE_RENDER(WINED3D_RS_MULTISAMPLEMASK), state_multisampmask }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3D_RS_DEBUGMONITORTOKEN), { STATE_RENDER(WINED3D_RS_DEBUGMONITORTOKEN), state_debug_monitor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3D_RS_ZVISIBLE), { STATE_RENDER(WINED3D_RS_ZVISIBLE), state_zvisible }, WINED3D_GL_EXT_NONE },
/* Samplers */
@@ -5502,7 +5501,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table)
{ 47, 47},
{ 61, 127},
{149, 150},
- {161, 161},
+ {161, 162},
{168, 169},
{171, 171},
{174, 177},
@@ -5544,6 +5543,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table)
STATE_COLOR_KEY,
STATE_BLEND,
STATE_BLEND_FACTOR,
+ STATE_SAMPLE_MASK,
};
unsigned int i, current;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index fa1763346bc..c18f2371758 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5262,6 +5262,8 @@ const char *debug_d3dstate(DWORD state)
return "STATE_BLEND";
if (STATE_IS_BLEND_FACTOR(state))
return "STATE_BLEND_FACTOR";
+ if (STATE_IS_SAMPLE_MASK(state))
+ return "STATE_SAMPLE_MASK";
return wine_dbg_sprintf("UNKNOWN_STATE(%#x)", state);
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index eb74aeb2bd4..fb0c8e78202 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1720,7 +1720,10 @@ enum wined3d_pipeline
#define STATE_BLEND_FACTOR (STATE_BLEND + 1)
#define STATE_IS_BLEND_FACTOR(a) ((a) == STATE_BLEND_FACTOR)
-#define STATE_COMPUTE_OFFSET (STATE_BLEND_FACTOR + 1)
+#define STATE_SAMPLE_MASK (STATE_BLEND_FACTOR + 1)
+#define STATE_IS_SAMPLE_MASK(a) ((a) == STATE_SAMPLE_MASK)
+
+#define STATE_COMPUTE_OFFSET (STATE_SAMPLE_MASK + 1)
#define STATE_COMPUTE_SHADER (STATE_COMPUTE_OFFSET)
#define STATE_IS_COMPUTE_SHADER(a) ((a) == STATE_COMPUTE_SHADER)
@@ -3284,6 +3287,7 @@ struct wined3d_state
DWORD render_states[WINEHIGHEST_RENDER_STATE + 1];
struct wined3d_blend_state *blend_state;
struct wined3d_color blend_factor;
+ unsigned int sample_mask;
struct wined3d_rasterizer_state *rasterizer_state;
};
@@ -4209,7 +4213,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw
void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *query, DWORD flags) DECLSPEC_HIDDEN;
void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
void wined3d_cs_emit_set_blend_state(struct wined3d_cs *cs, struct wined3d_blend_state *state,
- const struct wined3d_color *blend_factor) DECLSPEC_HIDDEN;
+ const struct wined3d_color *blend_factor, unsigned int sample_mask) DECLSPEC_HIDDEN;
void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx,
const struct wined3d_vec4 *plane) DECLSPEC_HIDDEN;
void wined3d_cs_emit_set_color_key(struct wined3d_cs *cs, struct wined3d_texture *texture,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index f9a0d9e0f89..3b541714f4f 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2336,7 +2336,7 @@ HRESULT __cdecl wined3d_device_end_scene(struct wined3d_device *device);
void __cdecl wined3d_device_evict_managed_resources(struct wined3d_device *device);
UINT __cdecl wined3d_device_get_available_texture_mem(const struct wined3d_device *device);
struct wined3d_blend_state * __cdecl wined3d_device_get_blend_state(const struct wined3d_device *device,
- struct wined3d_color *blend_factor);
+ struct wined3d_color *blend_factor, unsigned int *sample_mask);
HRESULT __cdecl wined3d_device_get_clip_status(const struct wined3d_device *device,
struct wined3d_clip_status *clip_status);
struct wined3d_shader * __cdecl wined3d_device_get_compute_shader(const struct wined3d_device *device);
@@ -2419,7 +2419,7 @@ void __cdecl wined3d_device_resolve_sub_resource(struct wined3d_device *device,
enum wined3d_format_id format_id);
void __cdecl wined3d_device_set_base_vertex_index(struct wined3d_device *device, INT base_index);
void __cdecl wined3d_device_set_blend_state(struct wined3d_device *device, struct wined3d_blend_state *blend_state,
- const struct wined3d_color *blend_factor);
+ const struct wined3d_color *blend_factor, unsigned int sample_mask);
HRESULT __cdecl wined3d_device_set_clip_status(struct wined3d_device *device,
const struct wined3d_clip_status *clip_status);
void __cdecl wined3d_device_set_compute_shader(struct wined3d_device *device, struct wined3d_shader *shader);
--
2.24.0
More information about the wine-devel
mailing list