[PATCH 0/1] MR6755: Draft: wined3d: Metal renderer
Mostly just boilerplate while I figure out how to best approach the Objective-C <-> C mess this will require. It likely won't go anywhere but I figured I would share. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/6755
From: Isaac Marovitz <isaacryu(a)icloud.com> --- dlls/wined3d/Makefile.in | 2 + dlls/wined3d/adapter_mtl.c | 429 +++++++++++++++++++++++++++++++++ dlls/wined3d/context_mtl.c | 22 ++ dlls/wined3d/directx.c | 3 + dlls/wined3d/sampler.c | 21 ++ dlls/wined3d/wined3d_main.c | 5 + dlls/wined3d/wined3d_mtl.h | 97 ++++++++ dlls/wined3d/wined3d_private.h | 3 + include/wine/wined3d.h | 1 + 9 files changed, 583 insertions(+) create mode 100644 dlls/wined3d/adapter_mtl.c create mode 100644 dlls/wined3d/context_mtl.c create mode 100644 dlls/wined3d/wined3d_mtl.h diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in index 69415ebb7f9..ec7bb7580f5 100644 --- a/dlls/wined3d/Makefile.in +++ b/dlls/wined3d/Makefile.in @@ -5,10 +5,12 @@ EXTRAINCL = $(VKD3D_PE_CFLAGS) SOURCES = \ adapter_gl.c \ + adapter_mtl.c \ adapter_vk.c \ buffer.c \ context.c \ context_gl.c \ + context_mtl.c \ context_vk.c \ cs.c \ device.c \ diff --git a/dlls/wined3d/adapter_mtl.c b/dlls/wined3d/adapter_mtl.c new file mode 100644 index 00000000000..64de5fc9fca --- /dev/null +++ b/dlls/wined3d/adapter_mtl.c @@ -0,0 +1,429 @@ +/* + * Copyright 2024 Isaac Marovitz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wined3d_private.h" +#include "wined3d_mtl.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); + +static void adapter_mtl_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps) +{ + caps->ddraw_caps.dds_caps |= WINEDDSCAPS_BACKBUFFER + | WINEDDSCAPS_COMPLEX + | WINEDDSCAPS_FRONTBUFFER + | WINEDDSCAPS_3DDEVICE + | WINEDDSCAPS_VIDEOMEMORY + | WINEDDSCAPS_OWNDC + | WINEDDSCAPS_LOCALVIDMEM + | WINEDDSCAPS_NONLOCALVIDMEM; + + caps->ddraw_caps.caps |= WINEDDCAPS_3D; + + caps->Caps2 |= WINED3DCAPS2_CANGENMIPMAP; + + caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_BLENDOP + | WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS + | WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS + | WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT + | WINED3DPMISCCAPS_SEPARATEALPHABLEND; + + caps->RasterCaps |= WINED3DPRASTERCAPS_MIPMAPLODBIAS + | WINED3DPRASTERCAPS_ANISOTROPY; + + caps->TextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC + | WINED3DPTFILTERCAPS_MINFANISOTROPIC; + + caps->MaxAnisotropy = 16; + + caps->SrcBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR; + + caps->DestBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR + | WINED3DPBLENDCAPS_SRCALPHASAT; + + caps->TextureCaps |= WINED3DPTEXTURECAPS_VOLUMEMAP + | WINED3DPTEXTURECAPS_MIPVOLUMEMAP + | WINED3DPTEXTURECAPS_VOLUMEMAP_POW2; + + caps->VolumeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFLINEAR + | WINED3DPTFILTERCAPS_MAGFPOINT + | WINED3DPTFILTERCAPS_MINFLINEAR + | WINED3DPTFILTERCAPS_MINFPOINT + | WINED3DPTFILTERCAPS_MIPFLINEAR + | WINED3DPTFILTERCAPS_MIPFPOINT + | WINED3DPTFILTERCAPS_LINEAR + | WINED3DPTFILTERCAPS_LINEARMIPLINEAR + | WINED3DPTFILTERCAPS_LINEARMIPNEAREST + | WINED3DPTFILTERCAPS_MIPLINEAR + | WINED3DPTFILTERCAPS_MIPNEAREST + | WINED3DPTFILTERCAPS_NEAREST; + + caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_INDEPENDENTUV + | WINED3DPTADDRESSCAPS_CLAMP + | WINED3DPTADDRESSCAPS_WRAP; + | WINED3DPTADDRESSCAPS_BORDER + | WINED3DPTADDRESSCAPS_MIRROR + | WINED3DPTADDRESSCAPS_MIRRORONCE; + + // TODO: + // caps->MaxVolumeExtent = ; + + caps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFLINEAR + | WINED3DPTFILTERCAPS_MAGFPOINT + | WINED3DPTFILTERCAPS_MINFLINEAR + | WINED3DPTFILTERCAPS_MINFPOINT + | WINED3DPTFILTERCAPS_MIPFLINEAR + | WINED3DPTFILTERCAPS_MIPFPOINT + | WINED3DPTFILTERCAPS_LINEAR + | WINED3DPTFILTERCAPS_LINEARMIPLINEAR + | WINED3DPTFILTERCAPS_LINEARMIPNEAREST + | WINED3DPTFILTERCAPS_MIPLINEAR + | WINED3DPTFILTERCAPS_MIPNEAREST + | WINED3DPTFILTERCAPS_NEAREST + | WINED3DPTFILTERCAPS_MAGFANISOTROPIC + | WINED3DPTFILTERCAPS_MINFANISOTROPIC; + + caps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER + | WINED3DPTADDRESSCAPS_MIRROR + | WINED3DPTADDRESSCAPS_MIRRORONCE; + + caps->StencilCaps |= WINED3DSTENCILCAPS_DECR + | WINED3DSTENCILCAPS_INCR + | WINED3DSTENCILCAPS_TWOSIDED; + + caps->DeclTypes |= WINED3DDTCAPS_FLOAT16_2 | WINED3DDTCAPS_FLOAT16_4; + + caps->MaxPixelShader30InstructionSlots = WINED3DMAX30SHADERINSTRUCTIONS; + caps->MaxVertexShader30InstructionSlots = WINED3DMAX30SHADERINSTRUCTIONS; + caps->PS20Caps.temp_count = WINED3DPS20_MAX_NUMTEMPS; + caps->VS20Caps.temp_count = WINED3DVS20_MAX_NUMTEMPS; +} + +static BOOL adapter_mtl_check_format(const struct wined3d_adapter *adapter, + const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format, + const struct wined3d_format *ds_format) +{ + return TRUE; +} + +static HRESULT adapter_mtl_create_buffer(struct wined3d_device *device, + const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data, + void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_buffer **buffer) +{ + struct wined3d_buffer_mtl *buffer_mtl; + HRESULT hr; + + TRACE("device %p, desc %p, data %p, parent %p, parent_ops %p, buffer %p.\n", + device, desc, data, parent, parent_ops, buffer); + + if (!(buffer_mtl = calloc(1, sizeof(*buffer_mtl)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = wined3d_buffer_mtl_init(buffer_mtl, device, desc, data, parent, parent_ops))) + { + WARN("Failed to initialise buffer, hr %#lx.\n", hr); + free(buffer_mtl); + return hr; + } + + TRACE("Created buffer %p.\n", buffer_mtl); + *buffer = &buffer_mtl->b; + + return hr; +} + +static void adapter_mtl_destroy_buffer(struct wined3d_buffer *buffer) +{ + struct wined3d_buffer_mtl *buffer_mtl = wined3d_buffer_mtl(buffer); + struct wined3d_device *device = buffer_mtl->b.resource.device; + unsigned int swapchain_count = device->swapchain_count; + + TRACE("buffer_mtl %p.\n", buffer_mtl); + + /* Take a reference to the device, in case releasing the buffer would + * cause the device to be destroyed. However, swapchain resources don't + * take a reference to the device, and we wouldn't want to increment the + * refcount on a device that's in the process of being destroyed. */ + if (swapchain_count) + wined3d_device_incref(device); + wined3d_buffer_cleanup(&buffer_mtl->b); + wined3d_cs_destroy_object(device->cs, free, buffer_mtl); + if (swapchain_count) + wined3d_device_decref(device); +} + +static HRESULT adapter_mtl_create_texture(struct wined3d_device *device, + const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count, + uint32_t flags, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture) +{ + struct wined3d_texture_mtl *texture_mtl; + HRESULT hr; + + TRACE("device %p, desc %p, layer_count %u, level_count %u, flags %#x, parent %p, parent_ops %p, texture %p.\n", + device, desc, layer_count, level_count, flags, parent, parent_ops, texture); + + if (!(texture_mtl = wined3d_texture_allocate_object_memory(sizeof(*texture_mtl), level_count, layer_count))) + return E_OUTOFMEMORY; + + if (FAILED(hr = wined3d_texture_mtl_init(texture_mtl, device, desc, + layer_count, level_count, flags, parent, parent_ops))) + { + WARN("Failed to initialise texture, hr %#lx.\n", hr); + free(texture_mtl); + return hr; + } + + TRACE("Created texture %p.\n", texture_mtl); + *texture = &texture_mtl->t; + + return hr; +} + +static void adapter_mtl_destroy_texture(struct wined3d_texture *texture) +{ + struct wined3d_texture_mtl *texture_mtl = wined3d_texture_mtl(texture); + struct wined3d_device *device = texture_mtl->t.resource.device; + unsigned int swapchain_count = device->swapchain_count; + + TRACE("texture_mtl %p.\n", texture_mtl); + + /* Take a reference to the device, in case releasing the texture would + * cause the device to be destroyed. However, swapchain resources don't + * take a reference to the device, and we wouldn't want to increment the + * refcount on a device that's in the process of being destroyed. */ + if (swapchain_count) + wined3d_device_incref(device); + + wined3d_texture_sub_resources_destroyed(texture); + texture->resource.parent_ops->wined3d_object_destroyed(texture->resource.parent); + + wined3d_texture_cleanup(&texture_mtl->t); + wined3d_cs_destroy_object(device->cs, free, texture_mtl); + + if (swapchain_count) + wined3d_device_decref(device); +} + +static HRESULT adapter_mtl_create_sampler(struct wined3d_device *device, const struct wined3d_sampler_desc *desc, + void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler) +{ + struct wined3d_sampler_mtl *sampler_mtl; + + TRACE("device %p, desc %p, parent %p, parent_ops %p, sampler %p.\n", + device, desc, parent, parent_ops, sampler); + + if (!(sampler_mtl = calloc(1, sizeof(*sampler_mtl)))) + return E_OUTOFMEMORY; + + wined3d_sampler_mtl_init(sampler_mtl, device, desc, parent, parent_ops); + + TRACE("Created sampler %p.\n", sampler_mtl); + *sampler = &sampler_mtl->s; + + return WINED3D_OK; +} + +static void wined3d_sampler_mtl_destroy_object(void *object) +{ + struct wined3d_sampler_mtl *sampler_mtl = object; + + TRACE("sampler_mtl %p.\n", sampler_mtl); + + free(sampler_mtl); +} + +static void adapter_mtl_destroy_sampler(struct wined3d_sampler *sampler) { + struct wined3d_sampler_mtl *sampler_mtl = wined3d_sampler_mtl(sampler); + + TRACE("sampler_mtl %p.\n", sampler_mtl); + + wined3d_cs_destroy_object(sampler->device->cs, wined3d_sampler_mtl_destroy_object, sampler_mtl); +} + +static HRESULT adapter_mtl_create_query(struct wined3d_device *device, enum wined3d_query_type type, + void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query) +{ + TRACE("device %p, type %#x, parent %p, parent_ops %p, query %p.\n", + device, type, parent, parent_ops, query); + + // TODO: Fix + return WINED3DERR_NOTAVAILABLE; +} + +static void wined3d_query_mtl_destroy_object(void *object) +{ + struct wined3d_query_mtl *query_mtl = object; + + TRACE("query_mtl %p.\n", query_mtl); + + query_mtl->q.query_ops->query_destroy(&query_mtl->q); +} + +static void adapter_mtl_destroy_query(struct wined3d_query *query) +{ + struct wined3d_query_mtl *query_mtl = wined3d_query_mtl(query); + + TRACE("query_mtl %p.\n", query_mtl); + + wined3d_cs_destroy_object(query->device->cs, wined3d_query_mtl_destroy_object, query_mtl); +} + +static void adapter_mtl_flush_context(struct wined3d_context *context) +{ + struct wined3d_context_mtl *context_mtl = wined3d_context_mtl(context); + + TRACE("context_mtl %p.\n", context_mtl); + + // TODO: Fix + // wined3d_context_mtl_submit_command_buffer(context_mtl); +} + +static void adapter_mtl_draw_primitive(struct wined3d_device *device, + const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters) +{ + struct wined3d_buffer_mtl *indirect_mtl = NULL; + // const struct wined3d_mtl_info *mtl_info; + struct wined3d_context_mtl *context_mtl; + // CMDBuff + uint32_t instance_count; + + TRACE("device %p, state %p, parameters %p.\n", device, state, parameters); + + context_mtl = wined3d_context_mtl(context_acquire(device, NULL, 0)); + + if (parameters->indirect) + indirect_mtl = wined3d_buffer_mtl(parameters->u.indirect.buffer); + + if (context_mtl->c.transform_feedback_active) + { + WARN("Transform feedback is not supported in Metal."); + } + + if (parameters->indirect) + { + if (parameters->indexed) + + else + } + else + { + instance_count = parameters->u.direct.instance_count; + if (!instance_count) + instance_count = 1; + + if (parameters->indexed) + + else + } + + context_release(&context_mtl->c); +} + +static void adapter_mtl_dispatch_compute(struct wined3d_device *device, + const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters) +{ + struct wined3d_buffer_mtl *indirect_mtl = NULL; + // const struct wined3d_mtl_info *mtl_info; + struct wined3d_context_mtl *context_mtl; + // CMDBuff + + TRACE("device %p, state %p, parameters %p.\n", device, state, parameters); + + context_mtl = wined3d_context_mtl(context_acquire(device, NULL, 0)); + + if (parameters->indirect) + indirect_mtl = wined3d_buffer_mtl(parameters->u.indirect.buffer); + + if (parameters->indirect) + { + // TODO + } + else + { + const struct wined3d_direct_dispatch_parameters *direct = ¶meters->u.direct; + } + + context_release(&context_mtl->c); +} + +static const struct wined3d_adapter_ops wined3d_adapter_mtl_ops = +{ + .adapter_destroy = NULL, + .adapter_create_device = NULL, + .adapter_destroy_device = NULL, + .adapter_acquire_context = NULL, + .adapter_release_context = NULL, + .adapter_get_wined3d_caps = adapter_mtl_get_wined3d_caps, + .adapter_check_format = adapter_mtl_check_format, + .adapter_init_3d = NULL, + .adapter_uninit_3d = NULL, + .adapter_map_bo_address = NULL, + .adapter_unmap_bo_address = NULL, + .adapter_copy_bo_address = NULL, + .adapter_flush_bo_address = NULL, + .adapter_alloc_bo = NULL, + .adapter_destroy_bo = NULL, + .adapter_create_swapchain = NULL, + .adapter_destroy_swapchain = NULL, + .adapter_create_buffer = adapter_mtl_create_buffer, + .adapter_destroy_buffer = adapter_mtl_destroy_buffer, + .adapter_create_texture = adapter_mtl_create_texture, + .adapter_destroy_texture = adapter_mtl_destroy_texture, + .adapter_create_rendertarget_view = NULL, + .adapter_destroy_rendertarget_view = NULL, + .adapter_create_shader_resource_view = NULL, + .adapter_destroy_shader_resource_view = NULL, + .adapter_create_unordered_access_view = NULL, + .adapter_destroy_unordered_access_view = NULL, + .adapter_create_sampler = adapter_mtl_create_sampler, + .adapter_destroy_sampler = adapter_mtl_destroy_sampler, + .adapter_create_query = adapter_mtl_create_query, + .adapter_destroy_query = adapter_mtl_destroy_query, + .adapter_flush_context = adapter_mtl_flush_context, + .adapter_draw_primitive = adapter_mtl_draw_primitive, + .adapter_dispatch_compute = adapter_mtl_dispatch_compute, + .adapter_clear_uav = NULL, + .adapter_generate_mipmap = NULL, +}; + +static BOOL wined3d_adapter_mtl_init(struct wined3d_adapter_mtl *adapter_mtl, + unsigned int ordinal, unsigned int wined3d_creation_flags) +{ + TRACE("adapter_mtl %p, ordinal %u, wined3d_creation_flags %#x.\n", + adapter_mtl, ordinal, wined3d_creation_flags); + + return FALSE; +} + +struct wined3d_adapter *wined3d_adapter_mtl_create(unsigned int ordinal, + unsigned int wined3d_creation_flags) +{ + struct wined3d_adapter_mtl *adapter_mtl; + + if (!(adapter_mtl = calloc(1, sizeof(*adapter_mtl)))) + return NULL; + + if (!wined3d_adapter_mtl_init(adapter_mtl, ordinal, wined3d_creation_flags)) + { + free(adapter_mtl); + return NULL; + } + + TRACE("Created adapter %p.\n", adapter_mtl); + + return &adapter_mtl->a; +} \ No newline at end of file diff --git a/dlls/wined3d/context_mtl.c b/dlls/wined3d/context_mtl.c new file mode 100644 index 00000000000..7d09145446b --- /dev/null +++ b/dlls/wined3d/context_mtl.c @@ -0,0 +1,22 @@ +/* + * Copyright 2024 Isaac Marovitz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wined3d_private.h" +#include "wined3d_mtl.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index f236a59f963..61ef92b3533 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -3490,6 +3490,9 @@ static struct wined3d_adapter *wined3d_adapter_create(unsigned int ordinal, DWOR if (wined3d_settings.renderer == WINED3D_RENDERER_VULKAN) return wined3d_adapter_vk_create(ordinal, wined3d_creation_flags); + if (wined3d_settings.renderer == WINED3D_RENDERER_METAL) + return wined3d_adapter_mtl_create(ordinal, wined3d_creation_flags); + return wined3d_adapter_gl_create(ordinal, wined3d_creation_flags); } diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c index afd26a527f9..3e426a8dc28 100644 --- a/dlls/wined3d/sampler.c +++ b/dlls/wined3d/sampler.c @@ -20,6 +20,7 @@ #include "wined3d_private.h" #include "wined3d_gl.h" #include "wined3d_vk.h" +#include "wined3d_mtl.h" WINE_DEFAULT_DEBUG_CHANNEL(d3d); @@ -284,6 +285,26 @@ void wined3d_sampler_vk_init(struct wined3d_sampler_vk *sampler_vk, struct wined wined3d_cs_init_object(device->cs, wined3d_sampler_vk_cs_init, sampler_vk); } +static void wined3d_sampler_mtl_cs_init(void *object) +{ + struct wined3d_sampler_mtl *sampler_mtl = object; + const struct wined3d_sampler_desc *desc; + const struct wined3d_d3d_info *d3d_info; + struct MTLSamplerDescriptor sampler_desc; + + TRACE("sampler_mtl %p.\n", sampler_mtl); +} + +void wined3d_sampler_mtl_init(struct wined3d_sampler_mtl *sampler_mtl, struct wined3d_device *device, + const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops) +{ + TRACE("sampler_mtl %p, device %p, desc %p, parent %p, parent_ops %p.\n", + sampler_mtl, device, desc, parent, parent_ops); + + wined3d_sampler_init(&sampler_mtl->s, device, desc, parent, parent_ops); + wined3d_cs_init_object(device->cs, wined3d_sampler_mtl_cs_init, sampler_mtl); +} + HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler) { diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c index 863428bb53a..995dc947429 100644 --- a/dlls/wined3d/wined3d_main.c +++ b/dlls/wined3d/wined3d_main.c @@ -452,6 +452,11 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) ERR_(winediag)("Using the OpenGL renderer.\n"); wined3d_settings.renderer = WINED3D_RENDERER_OPENGL; } + else if (!strcmp(buffer, "metal")) + { + ERR_(winediag)("Using the Metal renderer.\n"); + wined3d_settings.renderer = WINED3D_RENDERER_METAL; + } else if (!strcmp(buffer, "gdi") || !strcmp(buffer, "no3d")) { ERR_(winediag)("Disabling 3D support.\n"); diff --git a/dlls/wined3d/wined3d_mtl.h b/dlls/wined3d/wined3d_mtl.h new file mode 100644 index 00000000000..3921bfa9618 --- /dev/null +++ b/dlls/wined3d/wined3d_mtl.h @@ -0,0 +1,97 @@ +/* + * Copyright 2024 Isaac Marovitz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_WINED3D_MTL_H +#define __WINE_WINED3D_MTL_H + +#include "wine/wined3d.h" +#include "wined3d_private.h" + +struct wined3d_context_mtl +{ + struct wined3d_context c; +}; + +static inline struct wined3d_context_mtl *wined3d_context_mtl(struct wined3d_context *context) +{ + return CONTAINING_RECORD(context, struct wined3d_context_mtl, c); +} + +struct wined3d_adapter_mtl +{ + struct wined3d_adapter a; +}; + +static inline struct wined3d_adapter_mtl *wined3d_adapter_mtl(struct wined3d_adapter *adapter) +{ + return CONTAINING_RECORD(adapter, struct wined3d_adapter_mtl, a); +} + +struct wined3d_query_mtl +{ + struct wined3d_query q; +}; + +static inline struct wined3d_query_mtl *wined3d_query_mtl(struct wined3d_query *query) +{ + return CONTAINING_RECORD(query, struct wined3d_query_mtl, q); +} + +struct wined3d_texture_mtl +{ + struct wined3d_texture t; +}; + +static inline struct wined3d_texture_mtl *wined3d_texture_mtl(struct wined3d_texture *texture) +{ + return CONTAINING_RECORD(texture, struct wined3d_texture_mtl, s); +} + +HRESULT wined3d_texture_mtl_init(struct wined3d_texture_mtl *texture_mtl, struct wined3d_device *device, + const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count, + uint32_t flags, void *parent, const struct wined3d_parent_ops *parent_ops); + +struct wined3d_sampler_mtl +{ + struct wined3d_sampler s; +}; + +static inline struct wined3d_sampler_mtl *wined3d_sampler_mtl(struct wined3d_sampler *sampler) +{ + return CONTAINING_RECORD(sampler, struct wined3d_sampler_mtl, s); +} + +void wined3d_sampler_mtl_init(struct wined3d_sampler_mtl *sampler_mtl, + struct wined3d_device *device, const struct wined3d_sampler_desc *desc, + void *parent, const struct wined3d_parent_ops *parent_ops); + +struct wined3d_buffer_mtl +{ + struct wined3d_buffer b; +}; + +static inline struct wined3d_buffer_mtl *wined3d_buffer_mtl(struct wined3d_buffer *buffer) +{ + return CONTAINING_RECORD(buffer, struct wined3d_buffer_mtl, b); +} + +HRESULT wined3d_buffer_mtl_init(struct wined3d_buffer_mtl *buffer_mtl, struct wined3d_device *device, + const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data, + void *parent, const struct wined3d_parent_ops *parent_ops); + +#endif /* __WINE_WINED3D_MTL_H */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 511d135a8f5..fadd25c989f 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2603,6 +2603,9 @@ BOOL wined3d_get_primary_adapter_luid(LUID *luid); struct wined3d_adapter *wined3d_adapter_vk_create(unsigned int ordinal, unsigned int wined3d_creation_flags); +struct wined3d_adapter *wined3d_adapter_mtl_create(unsigned int ordinal, + unsigned int wined3d_creation_flags); + struct wined3d_adapter *wined3d_adapter_gl_create(unsigned int ordinal, unsigned int wined3d_creation_flags); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 73af1be484b..075fdadf085 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -58,6 +58,7 @@ enum wined3d_renderer WINED3D_RENDERER_AUTO, WINED3D_RENDERER_VULKAN, WINED3D_RENDERER_OPENGL, + WINED3D_RENDERER_METAL, WINED3D_RENDERER_NO3D, }; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6755
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=149424 Your paranoid android. === debian11 (build log) === ../wine/include/msvcrt/stddef.h:24:29: error: ‘struct wined3d_texture_mtl’ has no member named ‘s’ ../wine/dlls/wined3d/adapter_mtl.c:78:13: error: expected expression before ‘|’ token ../wine/dlls/wined3d/adapter_mtl.c:320:9: error: expected expression before ‘else’ ../wine/dlls/wined3d/adapter_mtl.c:330:9: error: expected expression before ‘else’ ../wine/include/msvcrt/stddef.h:24:29: error: ‘struct wined3d_texture_mtl’ has no member named ‘s’ Task: The win32 Wine build failed === debian11b (build log) === ../wine/include/msvcrt/stddef.h:24:29: error: ‘struct wined3d_texture_mtl’ has no member named ‘s’ ../wine/dlls/wined3d/adapter_mtl.c:78:13: error: expected expression before ‘|’ token ../wine/dlls/wined3d/adapter_mtl.c:320:9: error: expected expression before ‘else’ ../wine/dlls/wined3d/adapter_mtl.c:330:9: error: expected expression before ‘else’ Task: The wow64 Wine build failed
participants (3)
-
Isaac Marovitz -
Isaac Marovitz (@IsaacMarovitz) -
Marvin