diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index a898c2c4d71..b52e887869d 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -54,6 +54,7 @@ enum wined3d_cs_op WINED3D_CS_OP_SET_MATERIAL, WINED3D_CS_OP_RESET_STATE, WINED3D_CS_OP_DESTROY_OBJECT, + WINED3D_CS_OP_QUERY_ISSUE, }; struct wined3d_cs_present @@ -267,6 +268,13 @@ struct wined3d_cs_destroy_object void *object; }; +struct wined3d_cs_query_issue +{ + enum wined3d_cs_op opcode; + struct wined3d_query *query; + DWORD flags; +}; + static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) { const struct wined3d_cs_present *op = data; @@ -1215,6 +1223,26 @@ void wined3d_cs_emit_destroy_object(struct wined3d_cs *cs, void (*callback)(void cs->ops->submit(cs); } +static void wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) +{ + const struct wined3d_cs_query_issue *op = data; + struct wined3d_query *query = op->query; + + query->query_ops->query_issue(query, op->flags); +} + +void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *query, DWORD flags) +{ + struct wined3d_cs_query_issue *op; + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_QUERY_ISSUE; + op->query = query; + op->flags = flags; + + cs->ops->submit(cs); +} + static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = { /* WINED3D_CS_OP_PRESENT */ wined3d_cs_exec_present, @@ -1245,6 +1273,7 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void /* WINED3D_CS_OP_SET_MATERIAL */ wined3d_cs_exec_set_material, /* WINED3D_CS_OP_RESET_STATE */ wined3d_cs_exec_reset_state, /* WINED3D_CS_OP_DESTROY_OBJECT */ wined3d_cs_exec_destroy_object, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, }; static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c index 9843558b12f..97675ad7732 100644 --- a/dlls/wined3d/query.c +++ b/dlls/wined3d/query.c @@ -350,7 +350,7 @@ HRESULT CDECL wined3d_query_issue(struct wined3d_query *query, DWORD flags) { TRACE("query %p, flags %#x.\n", query, flags); - query->query_ops->query_issue(query, flags); + wined3d_cs_emit_query_issue(query->device->cs, query, flags); if (flags & WINED3DISSUE_BEGIN) query->state = QUERY_BUILDING; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index e3b0a56669b..e9339092f06 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3041,6 +3041,7 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, int base_vertex_idx, unsigned i unsigned int start_instance, unsigned int instance_count, BOOL indexed) DECLSPEC_HIDDEN; void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain, const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, DWORD flags) DECLSPEC_HIDDEN; +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_clip_plane(struct wined3d_cs *cs, UINT plane_idx, const struct wined3d_vec4 *plane) DECLSPEC_HIDDEN;