Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
November 2021
- 83 participants
- 2620 messages
[PATCH 5/6] wined3d: Introduce a wined3d_buffer_update_sub_resource() helper.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/buffer.c | 9 +++++++++
dlls/wined3d/cs.c | 9 ++-------
dlls/wined3d/wined3d_private.h | 2 ++
3 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 0634dd93e2d..fca8ab707f2 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1101,6 +1101,15 @@ void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_off
context_release(context);
}
+void wined3d_buffer_update_sub_resource(struct wined3d_buffer *buffer, struct wined3d_context *context,
+ const struct upload_bo *upload_bo, unsigned int offset, unsigned int size)
+{
+ if (upload_bo->addr.buffer_object && upload_bo->addr.buffer_object == (uintptr_t)buffer->buffer_object)
+ wined3d_context_flush_bo_address(context, &upload_bo->addr, size);
+ else
+ wined3d_buffer_copy_bo_address(buffer, context, offset, &upload_bo->addr, size);
+}
+
static void wined3d_buffer_init_data(struct wined3d_buffer *buffer,
struct wined3d_device *device, const struct wined3d_sub_resource_data *data)
{
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 3143865c469..1d909e0c706 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -2744,13 +2744,8 @@ static void wined3d_cs_exec_update_sub_resource(struct wined3d_cs *cs, const voi
if (resource->type == WINED3D_RTYPE_BUFFER)
{
- struct wined3d_buffer *buffer = buffer_from_resource(resource);
- size_t size = box->right - box->left;
-
- if (op->bo.addr.buffer_object && op->bo.addr.buffer_object == (uintptr_t)buffer->buffer_object)
- wined3d_context_flush_bo_address(context, &op->bo.addr, size);
- else
- wined3d_buffer_copy_bo_address(buffer, context, box->left, &op->bo.addr, size);
+ wined3d_buffer_update_sub_resource(buffer_from_resource(resource),
+ context, &op->bo, box->left, box->right - box->left);
goto done;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0b5165dbb5e..fc950cda3c3 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -5077,6 +5077,8 @@ BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
BYTE *wined3d_buffer_load_sysmem(struct wined3d_buffer *buffer, struct wined3d_context *context) DECLSPEC_HIDDEN;
BOOL wined3d_buffer_prepare_location(struct wined3d_buffer *buffer,
struct wined3d_context *context, unsigned int location) DECLSPEC_HIDDEN;
+void wined3d_buffer_update_sub_resource(struct wined3d_buffer *buffer, struct wined3d_context *context,
+ const struct upload_bo *upload_bo, unsigned int offset, unsigned int size) DECLSPEC_HIDDEN;
HRESULT wined3d_buffer_no3d_init(struct wined3d_buffer *buffer_no3d, struct wined3d_device *device,
const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data,
--
2.33.0
Nov. 8, 2021
[PATCH 4/6] wined3d: Allocate all OpenGL buffer BOs from heap.
by Zebediah Figura
That is, no longer allocate a wined3d_bo_gl as part of the wined3d_buffer_gl
structure.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/buffer.c | 10 ++++++++--
dlls/wined3d/wined3d_private.h | 2 --
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index a3004fcecff..0634dd93e2d 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -171,9 +171,11 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
struct wined3d_context_gl *context_gl)
{
struct wined3d_resource *resource = &buffer_gl->b.resource;
+ struct wined3d_bo_gl *bo_gl;
if (!buffer_gl->b.buffer_object)
return;
+ bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
if (context_gl->c.transform_feedback_active && (resource->bind_flags & WINED3D_BIND_STREAM_OUTPUT)
&& wined3d_context_is_graphics_state_dirty(&context_gl->c, STATE_STREAM_OUTPUT))
@@ -191,7 +193,8 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
buffer_gl->b.bo_user.valid = false;
list_remove(&buffer_gl->b.bo_user.entry);
- wined3d_context_gl_destroy_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_destroy_bo(context_gl, bo_gl);
+ heap_free(bo_gl);
buffer_gl->b.buffer_object = NULL;
}
@@ -210,6 +213,9 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf
TRACE("Creating an OpenGL buffer object for wined3d buffer %p with usage %s.\n",
buffer_gl, debug_d3dusage(buffer_gl->b.resource.usage));
+ if (!(bo = heap_alloc(sizeof(*bo))))
+ return FALSE;
+
size = buffer_gl->b.resource.size;
binding = wined3d_buffer_gl_binding_from_bind_flags(gl_info, buffer_gl->b.resource.bind_flags);
if (buffer_gl->b.resource.usage & WINED3DUSAGE_DYNAMIC)
@@ -218,12 +224,12 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf
coherent = false;
}
gl_storage_flags = wined3d_resource_gl_storage_flags(&buffer_gl->b.resource);
- bo = &buffer_gl->bo;
if (!wined3d_context_gl_create_bo(context_gl, size, binding, usage, coherent, gl_storage_flags, bo))
{
ERR("Failed to create OpenGL buffer object.\n");
buffer_gl->b.flags &= ~WINED3D_BUFFER_USE_BO;
buffer_clear_dirty_areas(&buffer_gl->b);
+ heap_free(bo);
return FALSE;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e04f2682c88..0b5165dbb5e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -5085,8 +5085,6 @@ HRESULT wined3d_buffer_no3d_init(struct wined3d_buffer *buffer_no3d, struct wine
struct wined3d_buffer_gl
{
struct wined3d_buffer b;
-
- struct wined3d_bo_gl bo;
};
static inline struct wined3d_buffer_gl *wined3d_buffer_gl(struct wined3d_buffer *buffer)
--
2.33.0
Nov. 8, 2021
[PATCH 3/6] wined3d: Avoid accessing the "bo" member of struct wined3d_buffer_gl.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/buffer.c | 14 +++++++++-----
dlls/wined3d/context_gl.c | 22 ++++++++++++----------
dlls/wined3d/state.c | 20 ++++++++++++++++----
dlls/wined3d/view.c | 22 +++++++++++++++-------
dlls/wined3d/wined3d_private.h | 11 +++++++++++
5 files changed, 63 insertions(+), 26 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index be4d095eba0..a3004fcecff 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -133,7 +133,9 @@ void wined3d_buffer_invalidate_location(struct wined3d_buffer *buffer, DWORD loc
/* Context activation is done by the caller. */
static void wined3d_buffer_gl_bind(struct wined3d_buffer_gl *buffer_gl, struct wined3d_context_gl *context_gl)
{
- wined3d_context_gl_bind_bo(context_gl, buffer_gl->bo.binding, buffer_gl->bo.id);
+ const struct wined3d_bo_gl *bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
+
+ wined3d_context_gl_bind_bo(context_gl, bo_gl->binding, bo_gl->id);
}
static GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *gl_info, uint32_t bind_flags)
@@ -225,7 +227,7 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf
return FALSE;
}
- list_add_head(&buffer_gl->bo.b.users, &buffer_gl->b.bo_user.entry);
+ list_add_head(&bo->b.users, &buffer_gl->b.bo_user.entry);
buffer_gl->b.buffer_object = &bo->b;
buffer_invalidate_bo_range(&buffer_gl->b, 0, 0);
@@ -1324,6 +1326,7 @@ static void wined3d_buffer_gl_upload_ranges(struct wined3d_buffer *buffer, struc
const void *data, unsigned int data_offset, unsigned int range_count, const struct wined3d_range *ranges)
{
struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
+ struct wined3d_bo_gl *bo_gl = wined3d_bo_gl(buffer->buffer_object);
struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(buffer);
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
const struct wined3d_range *range;
@@ -1336,10 +1339,10 @@ static void wined3d_buffer_gl_upload_ranges(struct wined3d_buffer *buffer, struc
while (range_count--)
{
range = &ranges[range_count];
- GL_EXTCALL(glBufferSubData(buffer_gl->bo.binding,
+ GL_EXTCALL(glBufferSubData(bo_gl->binding,
range->offset, range->size, (BYTE *)data + range->offset - data_offset));
}
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_bo(context_gl, bo_gl);
checkGLcall("buffer upload");
}
@@ -1348,6 +1351,7 @@ static void wined3d_buffer_gl_download_ranges(struct wined3d_buffer *buffer, str
void *data, unsigned int data_offset, unsigned int range_count, const struct wined3d_range *ranges)
{
struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
+ struct wined3d_bo_gl *bo_gl = wined3d_bo_gl(buffer->buffer_object);
struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(buffer);
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
const struct wined3d_range *range;
@@ -1360,7 +1364,7 @@ static void wined3d_buffer_gl_download_ranges(struct wined3d_buffer *buffer, str
while (range_count--)
{
range = &ranges[range_count];
- GL_EXTCALL(glGetBufferSubData(buffer_gl->bo.binding,
+ GL_EXTCALL(glGetBufferSubData(bo_gl->binding,
range->offset, range->size, (BYTE *)data + range->offset - data_offset));
}
checkGLcall("buffer download");
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c
index 09c871efcd4..22e82302b9d 100644
--- a/dlls/wined3d/context_gl.c
+++ b/dlls/wined3d/context_gl.c
@@ -3815,7 +3815,7 @@ static void context_gl_load_shader_resources(struct wined3d_context_gl *context_
buffer_gl = wined3d_buffer_gl(state->cb[i][j].buffer);
wined3d_buffer_load(&buffer_gl->b, &context_gl->c, state);
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_buffer(context_gl, &buffer_gl->b);
if (!buffer_gl->b.bo_user.valid)
device_invalidate_state(context_gl->c.device, STATE_CONSTANT_BUFFER(i));
}
@@ -3831,7 +3831,7 @@ static void context_gl_load_shader_resources(struct wined3d_context_gl *context_
{
buffer_gl = wined3d_buffer_gl(buffer_from_resource(view->resource));
wined3d_buffer_load(&buffer_gl->b, &context_gl->c, state);
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_buffer(context_gl, &buffer_gl->b);
srv_gl = wined3d_shader_resource_view_gl(view);
if (!srv_gl->bo_user.valid)
@@ -3869,7 +3869,7 @@ static void context_gl_load_unordered_access_resources(struct wined3d_context_gl
buffer_gl = wined3d_buffer_gl(buffer_from_resource(view->resource));
wined3d_buffer_load_location(&buffer_gl->b, &context_gl->c, WINED3D_LOCATION_BUFFER);
wined3d_unordered_access_view_invalidate_location(view, ~WINED3D_LOCATION_BUFFER);
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_buffer(context_gl, &buffer_gl->b);
uav_gl = wined3d_unordered_access_view_gl(view);
if (!uav_gl->bo_user.valid)
@@ -3901,7 +3901,7 @@ static void context_gl_load_stream_output_buffers(struct wined3d_context_gl *con
buffer_gl = wined3d_buffer_gl(state->stream_output[i].buffer);
wined3d_buffer_load(&buffer_gl->b, &context_gl->c, state);
wined3d_buffer_invalidate_location(&buffer_gl->b, ~WINED3D_LOCATION_BUFFER);
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_buffer(context_gl, &buffer_gl->b);
if (!buffer_gl->b.bo_user.valid)
device_invalidate_state(context_gl->c.device, STATE_STREAM_OUTPUT);
}
@@ -3977,7 +3977,7 @@ static BOOL context_apply_draw_state(struct wined3d_context *context,
e = &context->stream_info.elements[wined3d_bit_scan(&map)];
buffer_gl = wined3d_buffer_gl(state->streams[e->stream_idx].buffer);
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_buffer(context_gl, &buffer_gl->b);
}
if (indexed && state->index_buffer)
@@ -3989,7 +3989,7 @@ static BOOL context_apply_draw_state(struct wined3d_context *context,
wined3d_buffer_load(&buffer_gl->b, context, state);
if (!buffer_gl->b.bo_user.valid)
device_invalidate_state(device, STATE_INDEXBUFFER);
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_buffer(context_gl, &buffer_gl->b);
}
else
{
@@ -4338,11 +4338,12 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state
{
const struct wined3d_indirect_dispatch_parameters *indirect = ¶meters->u.indirect;
struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(indirect->buffer);
+ struct wined3d_bo_gl *bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
- GL_EXTCALL(glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, buffer_gl->bo.id));
+ GL_EXTCALL(glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, bo_gl->id));
GL_EXTCALL(glDispatchComputeIndirect((GLintptr)indirect->offset));
GL_EXTCALL(glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0));
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_bo(context_gl, bo_gl);
}
else
{
@@ -4725,6 +4726,7 @@ static void wined3d_context_gl_draw_indirect(struct wined3d_context_gl *context_
{
GLenum gl_primitive_type = gl_primitive_type_from_d3d(state->primitive_type);
struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(parameters->buffer);
+ struct wined3d_bo_gl *bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
const void *offset;
@@ -4734,7 +4736,7 @@ static void wined3d_context_gl_draw_indirect(struct wined3d_context_gl *context_
return;
}
- GL_EXTCALL(glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_gl->bo.id));
+ GL_EXTCALL(glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bo_gl->id));
offset = (void *)(GLintptr)parameters->offset;
if (idx_size)
@@ -4750,7 +4752,7 @@ static void wined3d_context_gl_draw_indirect(struct wined3d_context_gl *context_
}
GL_EXTCALL(glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0));
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_bo(context_gl, bo_gl);
checkGLcall("draw indirect");
}
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 5e41f681c75..788ccb580dd 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -4466,6 +4466,7 @@ static void indexbuffer(struct wined3d_context *context, const struct wined3d_st
const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
const struct wined3d_stream_info *stream_info = &context->stream_info;
struct wined3d_buffer_gl *buffer_gl;
+ const struct wined3d_bo_gl *bo_gl;
if (!state->index_buffer || !stream_info->all_vbo)
{
@@ -4474,8 +4475,15 @@ static void indexbuffer(struct wined3d_context *context, const struct wined3d_st
}
buffer_gl = wined3d_buffer_gl(state->index_buffer);
- GL_EXTCALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer_gl->bo.id));
- buffer_gl->b.bo_user.valid = true;
+ if ((bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object)))
+ {
+ GL_EXTCALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bo_gl->id));
+ buffer_gl->b.bo_user.valid = true;
+ }
+ else
+ {
+ GL_EXTCALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+ }
}
static void depth_clip(const struct wined3d_rasterizer_state *r, const struct wined3d_gl_info *gl_info)
@@ -4569,6 +4577,7 @@ static void state_cb(struct wined3d_context *context, const struct wined3d_state
const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
enum wined3d_shader_type shader_type;
struct wined3d_buffer_gl *buffer_gl;
+ struct wined3d_bo_gl *bo_gl;
unsigned int i, base, count;
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
@@ -4590,7 +4599,8 @@ static void state_cb(struct wined3d_context *context, const struct wined3d_state
}
buffer_gl = wined3d_buffer_gl(buffer_state->buffer);
- GL_EXTCALL(glBindBufferRange(GL_UNIFORM_BUFFER, base + i, buffer_gl->bo.id,
+ bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
+ GL_EXTCALL(glBindBufferRange(GL_UNIFORM_BUFFER, base + i, bo_gl->id,
buffer_state->offset, buffer_state->size));
buffer_gl->b.bo_user.valid = true;
}
@@ -4644,6 +4654,7 @@ static void state_so(struct wined3d_context *context, const struct wined3d_state
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
struct wined3d_buffer_gl *buffer_gl;
unsigned int offset, size, i;
+ struct wined3d_bo_gl *bo_gl;
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
@@ -4658,6 +4669,7 @@ static void state_so(struct wined3d_context *context, const struct wined3d_state
}
buffer_gl = wined3d_buffer_gl(state->stream_output[i].buffer);
+ bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
offset = state->stream_output[i].offset;
if (offset == ~0u)
{
@@ -4665,7 +4677,7 @@ static void state_so(struct wined3d_context *context, const struct wined3d_state
offset = 0;
}
size = buffer_gl->b.resource.size - offset;
- GL_EXTCALL(glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, i, buffer_gl->bo.id, offset, size));
+ GL_EXTCALL(glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, i, bo_gl->id, offset, size));
buffer_gl->b.bo_user.valid = true;
}
checkGLcall("bind transform feedback buffers");
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 8746d9168c2..77e98f27a75 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -249,6 +249,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
unsigned int offset, unsigned int size)
{
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
+ const struct wined3d_bo_gl *bo_gl;
if (!gl_info->supported[ARB_TEXTURE_BUFFER_OBJECT])
{
@@ -264,6 +265,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
}
wined3d_buffer_load_location(&buffer_gl->b, &context_gl->c, WINED3D_LOCATION_BUFFER);
+ bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
view->target = GL_TEXTURE_BUFFER;
if (!view->name)
@@ -272,13 +274,13 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
wined3d_context_gl_bind_texture(context_gl, GL_TEXTURE_BUFFER, view->name);
if (gl_info->supported[ARB_TEXTURE_BUFFER_RANGE])
{
- GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format_gl->internal, buffer_gl->bo.id, offset, size));
+ GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format_gl->internal, bo_gl->id, offset, size));
}
else
{
if (offset || size != buffer_gl->b.resource.size)
FIXME("OpenGL implementation does not support ARB_texture_buffer_range.\n");
- GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format_gl->internal, buffer_gl->bo.id));
+ GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format_gl->internal, bo_gl->id));
}
checkGLcall("Create buffer texture");
@@ -972,11 +974,13 @@ static void wined3d_shader_resource_view_gl_cs_init(void *object)
{
struct wined3d_buffer *buffer = buffer_from_resource(resource);
struct wined3d_context *context;
+ struct wined3d_bo *bo;
context = context_acquire(resource->device, NULL, 0);
create_buffer_view(&view_gl->gl_view, context, desc, buffer, view_format);
+ bo = (struct wined3d_bo *)buffer->buffer_object;
view_gl->bo_user.valid = true;
- list_add_head(&wined3d_buffer_gl(buffer)->bo.b.users, &view_gl->bo_user.entry);
+ list_add_head(&bo->users, &view_gl->bo_user.entry);
context_release(context);
}
else
@@ -1482,6 +1486,7 @@ void wined3d_unordered_access_view_gl_clear(struct wined3d_unordered_access_view
const struct wined3d_format_gl *format_gl;
struct wined3d_buffer_gl *buffer_gl;
struct wined3d_resource *resource;
+ struct wined3d_bo_gl *bo_gl;
unsigned int offset, size;
resource = view_gl->v.resource;
@@ -1591,11 +1596,12 @@ void wined3d_unordered_access_view_gl_clear(struct wined3d_unordered_access_view
wined3d_buffer_load_location(&buffer_gl->b, &context_gl->c, WINED3D_LOCATION_BUFFER);
wined3d_unordered_access_view_invalidate_location(&view_gl->v, ~WINED3D_LOCATION_BUFFER);
+ bo_gl = wined3d_bo_gl(buffer_gl->b.buffer_object);
get_buffer_view_range(&buffer_gl->b, &view_gl->v.desc, &format_gl->f, &offset, &size);
- wined3d_context_gl_bind_bo(context_gl, buffer_gl->bo.binding, buffer_gl->bo.id);
- GL_EXTCALL(glClearBufferSubData(buffer_gl->bo.binding, format_gl->internal,
+ wined3d_context_gl_bind_bo(context_gl, bo_gl->binding, bo_gl->id);
+ GL_EXTCALL(glClearBufferSubData(bo_gl->binding, format_gl->internal,
offset, size, format_gl->format, format_gl->type, clear_value));
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ wined3d_context_gl_reference_bo(context_gl, bo_gl);
checkGLcall("clear unordered access view");
}
@@ -1658,11 +1664,13 @@ static void wined3d_unordered_access_view_gl_cs_init(void *object)
{
struct wined3d_buffer *buffer = buffer_from_resource(resource);
struct wined3d_context_gl *context_gl;
+ struct wined3d_bo *bo;
context_gl = wined3d_context_gl(context_acquire(resource->device, NULL, 0));
create_buffer_view(&view_gl->gl_view, &context_gl->c, desc, buffer, view_gl->v.format);
+ bo = (struct wined3d_bo *)buffer->buffer_object;
view_gl->bo_user.valid = true;
- list_add_head(&wined3d_buffer_gl(buffer)->bo.b.users, &view_gl->bo_user.entry);
+ list_add_head(&bo->users, &view_gl->bo_user.entry);
if (desc->flags & (WINED3D_VIEW_BUFFER_COUNTER | WINED3D_VIEW_BUFFER_APPEND))
{
struct wined3d_bo_gl *bo = &view_gl->counter_bo;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 63fea9da0e7..e04f2682c88 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1612,6 +1612,11 @@ struct wined3d_bo_gl
uint64_t command_fence_id;
};
+static inline struct wined3d_bo_gl *wined3d_bo_gl(struct wined3d_bo *bo)
+{
+ return CONTAINING_RECORD(bo, struct wined3d_bo_gl, b);
+}
+
static inline GLuint wined3d_bo_gl_id(uintptr_t bo)
{
return bo ? ((struct wined3d_bo_gl *)bo)->id : 0;
@@ -6579,6 +6584,12 @@ static inline void wined3d_context_gl_reference_bo(struct wined3d_context_gl *co
bo_gl->command_fence_id = device_gl->current_fence_id;
}
+static inline void wined3d_context_gl_reference_buffer(struct wined3d_context_gl *context_gl,
+ struct wined3d_buffer *buffer)
+{
+ wined3d_context_gl_reference_bo(context_gl, wined3d_bo_gl(buffer->buffer_object));
+}
+
static inline bool wined3d_map_persistent(void)
{
return sizeof(void *) >= sizeof(uint64_t);
--
2.33.0
Nov. 8, 2021
[PATCH 2/6] wined3d: Make the "buffer_object" field of struct wined3d_buffer a wined3d_bo pointer.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/adapter_vk.c | 4 ++--
dlls/wined3d/buffer.c | 24 ++++++++++++------------
dlls/wined3d/context_vk.c | 8 ++++----
dlls/wined3d/cs.c | 2 +-
dlls/wined3d/view.c | 6 +++---
dlls/wined3d/wined3d_private.h | 9 +++++++--
6 files changed, 29 insertions(+), 24 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 8335a030b6b..62a9a342e9b 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1745,7 +1745,7 @@ static void adapter_vk_draw_primitive(struct wined3d_device *device,
if (parameters->indirect)
{
- struct wined3d_bo_vk *bo = (struct wined3d_bo_vk *)indirect_vk->b.buffer_object;
+ struct wined3d_bo_vk *bo = wined3d_bo_vk(indirect_vk->b.buffer_object);
uint32_t stride, size;
wined3d_context_vk_reference_bo(context_vk, bo);
@@ -1817,7 +1817,7 @@ static void adapter_vk_dispatch_compute(struct wined3d_device *device,
if (parameters->indirect)
{
- struct wined3d_bo_vk *bo = (struct wined3d_bo_vk *)indirect_vk->b.buffer_object;
+ struct wined3d_bo_vk *bo = wined3d_bo_vk(indirect_vk->b.buffer_object);
wined3d_context_vk_reference_bo(context_vk, bo);
VK_CALL(vkCmdDispatchIndirect(vk_command_buffer, bo->vk_buffer,
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 56069cb9f16..be4d095eba0 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -190,7 +190,7 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
buffer_gl->b.bo_user.valid = false;
list_remove(&buffer_gl->b.bo_user.entry);
wined3d_context_gl_destroy_bo(context_gl, &buffer_gl->bo);
- buffer_gl->b.buffer_object = 0;
+ buffer_gl->b.buffer_object = NULL;
}
/* Context activation is done by the caller. */
@@ -226,7 +226,7 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf
}
list_add_head(&buffer_gl->bo.b.users, &buffer_gl->b.bo_user.entry);
- buffer_gl->b.buffer_object = (uintptr_t)bo;
+ buffer_gl->b.buffer_object = &bo->b;
buffer_invalidate_bo_range(&buffer_gl->b, 0, 0);
return TRUE;
@@ -657,7 +657,7 @@ DWORD wined3d_buffer_get_memory(struct wined3d_buffer *buffer, struct wined3d_co
}
if (locations & WINED3D_LOCATION_BUFFER)
{
- data->buffer_object = buffer->buffer_object;
+ data->buffer_object = (uintptr_t)buffer->buffer_object;
data->addr = NULL;
return WINED3D_LOCATION_BUFFER;
}
@@ -969,7 +969,7 @@ static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resourc
if (count == 1)
{
- addr.buffer_object = buffer->buffer_object;
+ addr.buffer_object = (uintptr_t)buffer->buffer_object;
addr.addr = 0;
buffer->map_ptr = wined3d_context_map_bo_address(context, &addr, resource->size, flags);
/* We are accessing buffer->resource.client from the CS thread,
@@ -1049,7 +1049,7 @@ static HRESULT buffer_resource_sub_resource_unmap(struct wined3d_resource *resou
context = context_acquire(device, NULL, 0);
- addr.buffer_object = buffer->buffer_object;
+ addr.buffer_object = (uintptr_t)buffer->buffer_object;
addr.addr = 0;
wined3d_context_unmap_bo_address(context, &addr, range_count, buffer->maps);
@@ -1455,7 +1455,7 @@ static BOOL wined3d_buffer_vk_create_buffer_object(struct wined3d_buffer_vk *buf
list_init(&buffer_vk->b.bo_user.entry);
list_add_head(&bo_vk->b.users, &buffer_vk->b.bo_user.entry);
- buffer_vk->b.buffer_object = (uintptr_t)bo_vk;
+ buffer_vk->b.buffer_object = &bo_vk->b;
buffer_invalidate_bo_range(&buffer_vk->b, 0, 0);
return TRUE;
@@ -1463,7 +1463,7 @@ static BOOL wined3d_buffer_vk_create_buffer_object(struct wined3d_buffer_vk *buf
const VkDescriptorBufferInfo *wined3d_buffer_vk_get_buffer_info(struct wined3d_buffer_vk *buffer_vk)
{
- struct wined3d_bo_vk *bo = (struct wined3d_bo_vk *)buffer_vk->b.buffer_object;
+ struct wined3d_bo_vk *bo = wined3d_bo_vk(buffer_vk->b.buffer_object);
if (buffer_vk->b.bo_user.valid)
return &buffer_vk->buffer_info;
@@ -1499,8 +1499,8 @@ static BOOL wined3d_buffer_vk_prepare_location(struct wined3d_buffer *buffer,
static void wined3d_buffer_vk_unload_location(struct wined3d_buffer *buffer,
struct wined3d_context *context, unsigned int location)
{
- struct wined3d_bo_vk *bo_vk = (struct wined3d_bo_vk *)buffer->buffer_object;
struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
+ struct wined3d_bo_vk *bo_vk = wined3d_bo_vk(buffer->buffer_object);
TRACE("buffer %p, context %p, location %s.\n", buffer, context, wined3d_debug_location(location));
@@ -1511,7 +1511,7 @@ static void wined3d_buffer_vk_unload_location(struct wined3d_buffer *buffer,
list_remove(&buffer->bo_user.entry);
wined3d_context_vk_destroy_bo(context_vk, bo_vk);
heap_free(bo_vk);
- buffer->buffer_object = 0u;
+ buffer->buffer_object = NULL;
break;
default:
@@ -1535,14 +1535,14 @@ static void wined3d_buffer_vk_upload_ranges(struct wined3d_buffer *buffer, struc
if (!range_count)
return;
- dst.buffer_object = buffer->buffer_object;
+ dst.buffer_object = (uintptr_t)buffer->buffer_object;
dst.addr = NULL;
flags = WINED3D_MAP_WRITE;
if (!ranges->offset && ranges->size == resource->size)
flags |= WINED3D_MAP_DISCARD;
- dst_bo = (struct wined3d_bo_vk *)buffer->buffer_object;
+ dst_bo = wined3d_bo_vk(buffer->buffer_object);
if (!(dst_bo->memory_type & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) || (!(flags & WINED3D_MAP_DISCARD)
&& dst_bo->command_buffer_id > context_vk->completed_command_buffer_id))
{
@@ -1634,7 +1634,7 @@ void wined3d_buffer_vk_barrier(struct wined3d_buffer_vk *buffer_vk,
if (src_bind_mask)
{
- const struct wined3d_bo_vk *bo = (struct wined3d_bo_vk *)buffer_vk->b.buffer_object;
+ const struct wined3d_bo_vk *bo = wined3d_bo_vk(buffer_vk->b.buffer_object);
const struct wined3d_vk_info *vk_info = context_vk->vk_info;
VkBufferMemoryBarrier vk_barrier;
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 46769be516e..ec3554ddc30 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -2519,7 +2519,7 @@ static void wined3d_context_vk_bind_vertex_buffers(struct wined3d_context_vk *co
{
buffer_vk = wined3d_buffer_vk(buffer);
buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
- wined3d_context_vk_reference_bo(context_vk, (struct wined3d_bo_vk *)buffer->buffer_object);
+ wined3d_context_vk_reference_bo(context_vk, wined3d_bo_vk(buffer->buffer_object));
buffers[count] = buffer_info->buffer;
offsets[count] = buffer_info->offset + stream->offset;
++count;
@@ -2558,7 +2558,7 @@ static void wined3d_context_vk_bind_stream_output_buffers(struct wined3d_context
{
buffer_vk = wined3d_buffer_vk(buffer);
buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
- wined3d_context_vk_reference_bo(context_vk, (struct wined3d_bo_vk *)buffer->buffer_object);
+ wined3d_context_vk_reference_bo(context_vk, wined3d_bo_vk(buffer->buffer_object));
buffers[count] = buffer_info->buffer;
if ((offsets[count] = stream->offset) == ~0u)
{
@@ -2760,7 +2760,7 @@ static bool wined3d_shader_descriptor_writes_vk_add_cbv_write(struct wined3d_sha
if (!wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set,
binding->binding_idx, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, buffer_info, NULL, NULL))
return false;
- wined3d_context_vk_reference_bo(context_vk, (struct wined3d_bo_vk *)buffer->buffer_object);
+ wined3d_context_vk_reference_bo(context_vk, wined3d_bo_vk(buffer->buffer_object));
return true;
}
@@ -3408,7 +3408,7 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
idx_type = VK_INDEX_TYPE_UINT32;
buffer_vk = wined3d_buffer_vk(state->index_buffer);
buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
- wined3d_context_vk_reference_bo(context_vk, (struct wined3d_bo_vk *)buffer_vk->b.buffer_object);
+ wined3d_context_vk_reference_bo(context_vk, wined3d_bo_vk(buffer_vk->b.buffer_object));
VK_CALL(vkCmdBindIndexBuffer(vk_command_buffer, buffer_info->buffer,
buffer_info->offset + state->index_offset, idx_type));
}
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index e6ff448b028..3143865c469 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -2747,7 +2747,7 @@ static void wined3d_cs_exec_update_sub_resource(struct wined3d_cs *cs, const voi
struct wined3d_buffer *buffer = buffer_from_resource(resource);
size_t size = box->right - box->left;
- if (op->bo.addr.buffer_object && op->bo.addr.buffer_object == buffer->buffer_object)
+ if (op->bo.addr.buffer_object && op->bo.addr.buffer_object == (uintptr_t)buffer->buffer_object)
wined3d_context_flush_bo_address(context, &op->bo.addr, size);
else
wined3d_buffer_copy_bo_address(buffer, context, box->left, &op->bo.addr, size);
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index ee398be15f0..8746d9168c2 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -677,7 +677,7 @@ static VkBufferView wined3d_view_vk_create_vk_buffer_view(struct wined3d_context
get_buffer_view_range(&buffer_vk->b, desc, &view_format_vk->f, &offset, &size);
wined3d_buffer_prepare_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
- bo = (struct wined3d_bo_vk *)buffer_vk->b.buffer_object;
+ bo = wined3d_bo_vk(buffer_vk->b.buffer_object);
create_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
create_info.pNext = NULL;
@@ -1102,7 +1102,7 @@ static void wined3d_shader_resource_view_vk_cs_init(void *object)
if (!vk_buffer_view)
return;
- bo = (struct wined3d_bo_vk *)buffer_vk->b.buffer_object;
+ bo = wined3d_bo_vk(buffer_vk->b.buffer_object);
TRACE("Created buffer view 0x%s.\n", wine_dbgstr_longlong(vk_buffer_view));
@@ -2208,7 +2208,7 @@ static void wined3d_unordered_access_view_vk_cs_init(void *object)
if ((vk_buffer_view = wined3d_view_vk_create_vk_buffer_view(context_vk, desc, buffer_vk, format_vk)))
{
- struct wined3d_bo_vk *bo = (struct wined3d_bo_vk *)buffer_vk->b.buffer_object;
+ struct wined3d_bo_vk *bo = wined3d_bo_vk(buffer_vk->b.buffer_object);
TRACE("Created buffer view 0x%s.\n", wine_dbgstr_longlong(vk_buffer_view));
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 398bd73c5c0..63fea9da0e7 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1642,6 +1642,11 @@ struct wined3d_bo_vk
bool host_synced;
};
+static inline struct wined3d_bo_vk *wined3d_bo_vk(struct wined3d_bo *bo)
+{
+ return CONTAINING_RECORD(bo, struct wined3d_bo_vk, b);
+}
+
struct wined3d_bo_slab_vk_key
{
VkMemoryPropertyFlags memory_type;
@@ -5033,7 +5038,7 @@ struct wined3d_buffer
DWORD flags;
DWORD locations;
void *map_ptr;
- uintptr_t buffer_object;
+ struct wined3d_bo *buffer_object;
struct wined3d_bo_user bo_user;
struct wined3d_range *maps;
@@ -6319,7 +6324,7 @@ static inline void wined3d_context_vk_reference_resource(const struct wined3d_co
struct wined3d_resource *resource)
{
if (resource->type == WINED3D_RTYPE_BUFFER)
- wined3d_context_vk_reference_bo(context_vk, (struct wined3d_bo_vk *)buffer_from_resource(resource)->buffer_object);
+ wined3d_context_vk_reference_bo(context_vk, wined3d_bo_vk(buffer_from_resource(resource)->buffer_object));
else
wined3d_context_vk_reference_texture(context_vk, wined3d_texture_vk(texture_from_resource(resource)));
}
--
2.33.0
Nov. 8, 2021
[PATCH 1/6] wined3d: Reference vertex buffer objects only after calling context_update_stream_info().
by Zebediah Figura
It may load buffers into a different location.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/context_gl.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c
index d2dd9e0bd09..09c871efcd4 100644
--- a/dlls/wined3d/context_gl.c
+++ b/dlls/wined3d/context_gl.c
@@ -3963,12 +3963,23 @@ static BOOL context_apply_draw_state(struct wined3d_context *context,
device_invalidate_state(device, STATE_STREAMSRC);
else
wined3d_buffer_load(&buffer_gl->b, context, state);
- wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
}
/* Loading the buffers above may have invalidated the stream info. */
if (wined3d_context_is_graphics_state_dirty(context, STATE_STREAMSRC))
context_update_stream_info(context, state);
+ map = context->stream_info.use_map;
+ while (map)
+ {
+ const struct wined3d_stream_info_element *e;
+ struct wined3d_buffer_gl *buffer_gl;
+
+ e = &context->stream_info.elements[wined3d_bit_scan(&map)];
+ buffer_gl = wined3d_buffer_gl(state->streams[e->stream_idx].buffer);
+
+ wined3d_context_gl_reference_bo(context_gl, &buffer_gl->bo);
+ }
+
if (indexed && state->index_buffer)
{
struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(state->index_buffer);
--
2.33.0
Nov. 8, 2021
[PATCH] Subject: [PATCH] wbemprox: add empty DNSDomain to Win32_NetworkAdapterConfiguration
by Louis Lenders
https://bugs.winehq.org/show_bug.cgi?id=51938
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
dlls/wbemprox/builtin.c | 3 +++
dlls/wbemprox/tests/query.c | 12 ++++++++++++
2 files changed, 15 insertions(+)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 346ba365b74..3fccd3fb600 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -215,6 +215,7 @@ static const struct column col_networkadapterconfig[] =
{ L"DefaultIPGateway", CIM_STRING|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC },
{ L"Description", CIM_STRING|COL_FLAG_DYNAMIC },
{ L"DHCPEnabled", CIM_BOOLEAN },
+ { L"DNSDomain", CIM_STRING },
{ L"DNSHostName", CIM_STRING|COL_FLAG_DYNAMIC },
{ L"DNSServerSearchOrder", CIM_STRING|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC },
{ L"Index", CIM_UINT32|COL_FLAG_KEY },
@@ -632,6 +633,7 @@ struct record_networkadapterconfig
const struct array *defaultipgateway;
const WCHAR *description;
int dhcpenabled;
+ const WCHAR *dnsdomain;
const WCHAR *dnshostname;
const struct array *dnsserversearchorder;
UINT32 index;
@@ -2989,6 +2991,7 @@ static enum fill_status fill_networkadapterconfig( struct table *table, const st
rec->defaultipgateway = get_defaultipgateway( aa->FirstGatewayAddress );
rec->description = heap_strdupW( aa->Description );
rec->dhcpenabled = -1;
+ rec->dnsdomain = L"";
rec->dnshostname = get_dnshostname( aa->FirstUnicastAddress );
rec->dnsserversearchorder = get_dnsserversearchorder( aa->FirstDnsServerAddress );
rec->index = aa->u.s.IfIndex;
diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
index b3a0e3c4534..577a352c26f 100644
--- a/dlls/wbemprox/tests/query.c
+++ b/dlls/wbemprox/tests/query.c
@@ -1331,8 +1331,10 @@ static void test_Win32_NetworkAdapterConfiguration( IWbemServices *services )
BSTR wql = SysAllocString( L"wql" ), query = SysAllocString( L"SELECT * FROM Win32_NetworkAdapterConfiguration" );
IEnumWbemClassObject *result;
IWbemClassObject *obj;
+ CIMTYPE type;
HRESULT hr;
DWORD count;
+ VARIANT val;
hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
ok( hr == S_OK, "got %08x\n", hr );
@@ -1345,6 +1347,16 @@ static void test_Win32_NetworkAdapterConfiguration( IWbemServices *services )
check_property( obj, L"Description", VT_BSTR, CIM_STRING );
check_property( obj, L"Index", VT_I4, CIM_UINT32 );
check_property( obj, L"IPEnabled", VT_BOOL, CIM_BOOLEAN );
+
+ type = 0xdeadbeef;
+ VariantInit( &val );
+ hr = IWbemClassObject_Get( obj, L"DNSDomain", 0, &val, &type, NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
+ ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
+ trace( "DNSDomain %s\n", wine_dbgstr_w(V_BSTR( &val )) );
+ VariantClear( &val );
+
IWbemClassObject_Release( obj );
}
--
2.33.1
Nov. 8, 2021
Re: [PATCH vkd3d v3 04/14] tests: Initialize current_texture variable.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
Nov. 8, 2021
[PATCH v2 5/5] winegstreamer: Implement IWMOutputMediaProps::GetType().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winegstreamer/wm_reader.c | 8 ++++++--
dlls/wmvcore/tests/wmvcore.c | 30 +++++++++++++++++++++++++++---
2 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index b9e1a1b3d03..bcae50e5d1e 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -85,8 +85,12 @@ static ULONG WINAPI output_props_Release(IWMOutputMediaProps *iface)
static HRESULT WINAPI output_props_GetType(IWMOutputMediaProps *iface, GUID *major_type)
{
- FIXME("iface %p, major_type %p, stub!\n", iface, major_type);
- return E_NOTIMPL;
+ const struct output_props *props = impl_from_IWMOutputMediaProps(iface);
+
+ TRACE("iface %p, major_type %p.\n", iface, major_type);
+
+ *major_type = props->mt.majortype;
+ return S_OK;
}
static HRESULT WINAPI output_props_GetMediaType(IWMOutputMediaProps *iface, WM_MEDIA_TYPE *mt, DWORD *size)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index 591ecf209eb..ec66fb1bb74 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -861,12 +861,12 @@ static void test_sync_reader_types(void)
bool got_video = false, got_audio = false;
DWORD size, ret_size, output_number;
WORD stream_number, stream_number2;
+ GUID majortype, majortype2;
struct teststream stream;
IWMStreamConfig *config;
ULONG count, ref, i, j;
IWMSyncReader *reader;
IWMProfile *profile;
- GUID majortype;
HANDLE file;
HRESULT hr;
BOOL ret;
@@ -923,6 +923,12 @@ static void test_sync_reader_types(void)
hr = IWMOutputMediaProps_GetMediaType(output_props, mt, &ret_size);
ok(hr == S_OK, "Got hr %#x.\n", hr);
+ memset(&majortype2, 0xcc, sizeof(majortype2));
+ hr = IWMOutputMediaProps_GetType(output_props, &majortype2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(IsEqualGUID(&majortype2, &majortype), "Expected major type %s, got %s.\n",
+ debugstr_guid(&majortype), debugstr_guid(&majortype2));
+
ref = IWMOutputMediaProps_Release(output_props);
ok(!ref, "Got outstanding refcount %d.\n", ref);
@@ -981,6 +987,12 @@ static void test_sync_reader_types(void)
else
check_video_type(mt);
+ memset(&majortype2, 0xcc, sizeof(majortype2));
+ hr = IWMOutputMediaProps_GetType(output_props, &majortype2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(IsEqualGUID(&majortype2, &majortype), "Expected major type %s, got %s.\n",
+ debugstr_guid(&majortype), debugstr_guid(&majortype2));
+
hr = IWMSyncReader_SetOutputProps(reader, output_number, output_props);
ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IWMSyncReader_SetOutputProps(reader, 1 - output_number, output_props);
@@ -1398,13 +1410,13 @@ static void test_async_reader_types(void)
bool got_video = false, got_audio = false;
DWORD size, ret_size, output_number;
IWMReaderAdvanced2 *advanced;
+ GUID majortype, majortype2;
struct teststream stream;
struct callback callback;
IWMStreamConfig *config;
ULONG count, ref, i, j;
IWMProfile *profile;
IWMReader *reader;
- GUID majortype;
HANDLE file;
HRESULT hr;
BOOL ret;
@@ -1458,11 +1470,17 @@ static void test_async_reader_types(void)
ret_size = sizeof(mt_buffer);
hr = IWMOutputMediaProps_GetMediaType(output_props, mt, &ret_size);
ok(hr == S_OK, "Got hr %#x.\n", hr);
+ majortype = mt->majortype;
+
+ memset(&majortype2, 0xcc, sizeof(majortype2));
+ hr = IWMOutputMediaProps_GetType(output_props, &majortype2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(IsEqualGUID(&majortype2, &majortype), "Expected major type %s, got %s.\n",
+ debugstr_guid(&majortype), debugstr_guid(&majortype2));
ref = IWMOutputMediaProps_Release(output_props);
ok(!ref, "Got outstanding refcount %d.\n", ref);
- majortype = mt->majortype;
if (IsEqualGUID(&majortype, &MEDIATYPE_Audio))
{
got_audio = true;
@@ -1538,6 +1556,12 @@ static void test_async_reader_types(void)
else
check_video_type(mt);
+ memset(&majortype2, 0xcc, sizeof(majortype2));
+ hr = IWMOutputMediaProps_GetType(output_props, &majortype2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(IsEqualGUID(&majortype2, &majortype), "Expected major type %s, got %s.\n",
+ debugstr_guid(&majortype), debugstr_guid(&majortype2));
+
hr = IWMReader_SetOutputProps(reader, output_number, output_props);
ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IWMReader_SetOutputProps(reader, 1 - output_number, output_props);
--
2.33.0
Nov. 8, 2021
[PATCH v2 4/5] winegstreamer: Implement IWMReader::Open().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winegstreamer/wm_asyncreader.c | 19 ++++++++---
dlls/wmvcore/tests/wmvcore.c | 49 +++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c
index 4193d7d75de..b7b96c8b884 100644
--- a/dlls/winegstreamer/wm_asyncreader.c
+++ b/dlls/winegstreamer/wm_asyncreader.c
@@ -188,11 +188,22 @@ static ULONG WINAPI WMReader_Release(IWMReader *iface)
return IWMProfile3_Release(&reader->reader.IWMProfile3_iface);
}
-static HRESULT WINAPI WMReader_Open(IWMReader *iface, const WCHAR *url, IWMReaderCallback *callback, void *context)
+static HRESULT WINAPI WMReader_Open(IWMReader *iface, const WCHAR *url,
+ IWMReaderCallback *callback, void *context)
{
- struct async_reader *This = impl_from_IWMReader(iface);
- FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(url), callback, context);
- return E_NOTIMPL;
+ struct async_reader *reader = impl_from_IWMReader(iface);
+ HRESULT hr;
+
+ TRACE("reader %p, url %s, callback %p, context %p.\n",
+ reader, debugstr_w(url), callback, context);
+
+ EnterCriticalSection(&reader->reader.cs);
+
+ if (SUCCEEDED(hr = wm_reader_open_file(&reader->reader, url)))
+ open_stream(reader, callback, context);
+
+ LeaveCriticalSection(&reader->reader.cs);
+ return hr;
}
static HRESULT WINAPI WMReader_Close(IWMReader *iface)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index f8962b784ac..591ecf209eb 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -1613,6 +1613,54 @@ static void test_async_reader_types(void)
ok(ret, "Failed to delete %s, error %u.\n", debugstr_w(filename), GetLastError());
}
+static void test_async_reader_file(void)
+{
+ const WCHAR *filename = load_resource(L"test.wmv");
+ struct callback callback;
+ IWMReader *reader;
+ DWORD count;
+ HRESULT hr;
+ ULONG ref;
+ BOOL ret;
+
+ callback_init(&callback);
+
+ hr = WMCreateReader(NULL, 0, &reader);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IWMReader_Open(reader, filename, &callback.IWMReaderCallback_iface, (void **)0xdeadbeef);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(callback.refcount > 1, "Got refcount %d.\n", callback.refcount);
+ ret = WaitForSingleObject(callback.got_opened, 1000);
+ ok(!ret, "Wait timed out.\n");
+
+ count = 0xdeadbeef;
+ hr = IWMReader_GetOutputCount(reader, &count);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(count == 2, "Got count %u.\n", count);
+
+ hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IWMReader_Close(reader);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(callback.got_closed == 1, "Got %u WMT_CLOSED callbacks.\n", callback.got_closed);
+ ok(callback.refcount == 1, "Got outstanding refcount %d.\n", callback.refcount);
+ callback_cleanup(&callback);
+
+ hr = IWMReader_Close(reader);
+ ok(hr == NS_E_INVALID_REQUEST, "Got hr %#x.\n", hr);
+
+ ref = IWMReader_Release(reader);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ok(callback.got_closed == 1, "Got %u WMT_CLOSED callbacks.\n", callback.got_closed);
+ ok(callback.refcount == 1, "Got outstanding refcount %d.\n", callback.refcount);
+ callback_cleanup(&callback);
+
+ ret = DeleteFileW(filename);
+ ok(ret, "Failed to delete %s, error %u.\n", debugstr_w(filename), GetLastError());
+}
+
START_TEST(wmvcore)
{
HRESULT hr;
@@ -1634,6 +1682,7 @@ START_TEST(wmvcore)
test_sync_reader_file();
test_async_reader_streaming();
test_async_reader_types();
+ test_async_reader_file();
CoUninitialize();
}
--
2.33.0
Nov. 8, 2021
[PATCH v2 3/5] winegstreamer: Implement INSSBuffer::SetLength().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winegstreamer/wm_reader.c | 17 ++++++++++++-----
dlls/wmvcore/tests/wmvcore.c | 22 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index 2c0f89e29a9..b9e1a1b3d03 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -172,7 +172,7 @@ struct buffer
INSSBuffer INSSBuffer_iface;
LONG refcount;
- DWORD size;
+ DWORD size, capacity;
BYTE data[1];
};
@@ -231,8 +231,15 @@ static HRESULT WINAPI buffer_GetLength(INSSBuffer *iface, DWORD *size)
static HRESULT WINAPI buffer_SetLength(INSSBuffer *iface, DWORD size)
{
- FIXME("iface %p, size %u, stub!\n", iface, size);
- return E_NOTIMPL;
+ struct buffer *buffer = impl_from_INSSBuffer(iface);
+
+ TRACE("iface %p, size %u.\n", buffer, size);
+
+ if (size > buffer->capacity)
+ return E_INVALIDARG;
+
+ buffer->size = size;
+ return S_OK;
}
static HRESULT WINAPI buffer_GetMaxLength(INSSBuffer *iface, DWORD *size)
@@ -241,7 +248,7 @@ static HRESULT WINAPI buffer_GetMaxLength(INSSBuffer *iface, DWORD *size)
TRACE("buffer %p, size %p.\n", buffer, size);
- *size = buffer->size;
+ *size = buffer->capacity;
return S_OK;
}
@@ -1754,7 +1761,7 @@ HRESULT wm_reader_get_stream_sample(struct wm_stream *stream,
object->INSSBuffer_iface.lpVtbl = &buffer_vtbl;
object->refcount = 1;
- object->size = event.u.buffer.size;
+ object->capacity = object->size = event.u.buffer.size;
if (!wg_parser_stream_copy_buffer(wg_stream, object->data, 0, object->size))
{
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index 0347195ba10..f8962b784ac 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -686,6 +686,17 @@ static void test_sync_reader_streaming(void)
ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(size <= capacity, "Size %u exceeds capacity %u.\n", size, capacity);
+ hr = INSSBuffer_SetLength(sample, capacity + 1);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ hr = INSSBuffer_SetLength(sample, capacity - 1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = INSSBuffer_GetBufferAndLength(sample, &data2, &size);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(data2 == data, "Data pointers didn't match.\n");
+ ok(size == capacity - 1, "Expected size %u, got %u.\n", capacity - 1, size);
+
ref = INSSBuffer_Release(sample);
ok(!ref, "Got outstanding refcount %d.\n", ref);
@@ -1222,6 +1233,17 @@ static HRESULT WINAPI callback_OnSample(IWMReaderCallback *iface, DWORD output,
ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(size <= capacity, "Size %u exceeds capacity %u.\n", size, capacity);
+ hr = INSSBuffer_SetLength(sample, capacity + 1);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ hr = INSSBuffer_SetLength(sample, capacity - 1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = INSSBuffer_GetBufferAndLength(sample, &data2, &size);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(data2 == data, "Data pointers didn't match.\n");
+ ok(size == capacity - 1, "Expected size %u, got %u.\n", capacity - 1, size);
+
ok(callback->got_started > 0, "Got %u WMT_STARTED callbacks.\n", callback->got_started);
ok(!callback->got_eof, "Got %u WMT_EOF callbacks.\n", callback->got_eof);
++callback->got_sample;
--
2.33.0
Nov. 8, 2021