Wine-devel
Threads by month
- ----- 2026 -----
- 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
March 2019
- 76 participants
- 1010 discussions
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
dlls/mfplat/buffer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index afdb525dea..455294787e 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -521,7 +521,7 @@ static HRESULT WINAPI sample_GetBufferCount(IMFSample *iface, DWORD *count)
EnterCriticalSection(&sample->cs);
*count = sample->buffer_count;
- EnterCriticalSection(&sample->cs);
+ LeaveCriticalSection(&sample->cs);
return S_OK;
}
--
2.20.1
1
0
1
0
[PATCH v3 1/6] quartz/tests: Add some tests for AVI decompressor pin interfaces.
by Zebediah Figura 08 Mar '19
by Zebediah Figura 08 Mar '19
08 Mar '19
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/tests/avidec.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c
index 05065446f1..330d292f0f 100644
--- a/dlls/quartz/tests/avidec.c
+++ b/dlls/quartz/tests/avidec.c
@@ -61,6 +61,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO
static void test_interfaces(void)
{
IBaseFilter *filter = create_avi_dec();
+ IPin *pin;
check_interface(filter, &IID_IBaseFilter, TRUE);
check_interface(filter, &IID_IMediaFilter, TRUE);
@@ -80,6 +81,30 @@ static void test_interfaces(void)
check_interface(filter, &IID_IReferenceClock, FALSE);
check_interface(filter, &IID_IVideoWindow, FALSE);
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ check_interface(pin, &IID_IMemInputPin, TRUE);
+ check_interface(pin, &IID_IPin, TRUE);
+ todo_wine check_interface(pin, &IID_IQualityControl, TRUE);
+ check_interface(pin, &IID_IUnknown, TRUE);
+
+ check_interface(pin, &IID_IMediaPosition, FALSE);
+ todo_wine check_interface(pin, &IID_IMediaSeeking, FALSE);
+
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, source_id, &pin);
+
+ check_interface(pin, &IID_IPin, TRUE);
+ todo_wine check_interface(pin, &IID_IMediaPosition, TRUE);
+ check_interface(pin, &IID_IMediaSeeking, TRUE);
+ check_interface(pin, &IID_IQualityControl, TRUE);
+ check_interface(pin, &IID_IUnknown, TRUE);
+
+ check_interface(pin, &IID_IAsyncReader, FALSE);
+
+ IPin_Release(pin);
+
IBaseFilter_Release(filter);
}
--
2.20.1
1
5
Signed-off-by: Nakarin Khankham <garuda2550(a)gmail.com>
---
dlls/opencl/opencl.c | 192 ++++++++++++++++++++++++++++++++++++++++
dlls/opencl/opencl.spec | 10 +++
2 files changed, 202 insertions(+)
diff --git a/dlls/opencl/opencl.c b/dlls/opencl/opencl.c
index 9ea96a5e3a..fb997df439 100644
--- a/dlls/opencl/opencl.c
+++ b/dlls/opencl/opencl.c
@@ -196,6 +196,28 @@ static cl_int (*pclEnqueueBarrier)(cl_command_queue command_queue);
/* Extension function access */
static void * (*pclGetExtensionFunctionAddress)(const char * func_name);
+/* OpenCL 1.1 functions */
+static cl_mem (*pclCreateSubBuffer)(cl_mem buffer, cl_mem_flags flags,
+ cl_buffer_create_type buffer_create_type, const void * buffer_create_info, cl_int * errcode_ret);
+static cl_event (*pclCreateUserEvent)(cl_context context, cl_int * errcode_ret);
+static cl_int (*pclEnqueueCopyBufferRect)(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer,
+ const size_t * src_origin, const size_t * dst_origin, const size_t * region,
+ size_t src_row_pitch, size_t src_slice_pitch,
+ size_t dst_row_pitch, size_t dst_slice_pitch,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueReadBufferRect)(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read,
+ const size_t * buffer_origin, const size_t * host_origin, const size_t * region,
+ size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch,
+ void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueWriteBufferRect)(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read,
+ const size_t * buffer_origin, const size_t * host_origin, const size_t * region,
+ size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch,
+ const void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclSetEventCallback)(cl_event event, cl_int command_exec_callback_type,
+ void WINAPI (*pfn_notify)(cl_event, cl_int, void *), void *user_data);
+static cl_int (*pclSetMemObjectDestructorCallback)(cl_mem memobj, void WINAPI(*pfn_notify)(cl_mem, void*), void *user_data);
+static cl_int (*pclSetUserEventStatus)(cl_event event, cl_int execution_status);
+
static BOOL init_opencl(void);
static BOOL load_opencl_func(void);
@@ -358,6 +380,18 @@ static BOOL load_opencl_func(void)
/* Extension function access */
LOAD_FUNCPTR(clGetExtensionFunctionAddress);
+ /* OpenCL 1.1 functions */
+#ifdef CL_VERSION_1_1
+ LOAD_FUNCPTR(clCreateSubBuffer);
+ LOAD_FUNCPTR(clCreateUserEvent);
+ LOAD_FUNCPTR(clEnqueueCopyBufferRect);
+ LOAD_FUNCPTR(clEnqueueReadBufferRect);
+ LOAD_FUNCPTR(clEnqueueWriteBufferRect);
+ LOAD_FUNCPTR(clSetEventCallback);
+ LOAD_FUNCPTR(clSetMemObjectDestructorCallback);
+ LOAD_FUNCPTR(clSetUserEventStatus);
+#endif
+
#undef LOAD_FUNCPTR
return TRUE;
@@ -648,6 +682,20 @@ cl_mem WINAPI wine_clCreateBuffer(cl_context context, cl_mem_flags flags, size_t
return ret;
}
+cl_mem WINAPI wine_clCreateSubBuffer(cl_mem buffer, cl_mem_flags flags,
+ cl_buffer_create_type buffer_create_type, const void * buffer_create_info, cl_int * errcode_ret)
+{
+ cl_mem ret;
+ TRACE("\n");
+ if (!pclCreateSubBuffer)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateSubBuffer(buffer, flags, buffer_create_type, buffer_create_info, errcode_ret);
+ return ret;
+}
+
cl_mem WINAPI wine_clCreateImage2D(cl_context context, cl_mem_flags flags, cl_image_format * image_format,
size_t image_width, size_t image_height, size_t image_row_pitch, void * host_ptr, cl_int * errcode_ret)
{
@@ -725,6 +773,45 @@ cl_int WINAPI wine_clGetImageInfo(cl_mem image, cl_image_info param_name, size_t
return ret;
}
+typedef struct
+{
+ void WINAPI (*pfn_notify)(cl_mem memobj, void* user_data);
+ void *user_data;
+} MEM_CALLBACK;
+
+static void WINAPI mem_fn_notify(cl_mem memobj, void* user_data)
+{
+ MEM_CALLBACK *pcb;
+ FIXME("(%p, %p)\n", memobj, user_data);
+ pcb = (MEM_CALLBACK *) user_data;
+ if(pcb->pfn_notify) pcb->pfn_notify(memobj, pcb->user_data);
+ FIXME("Callback COMPLETED\n");
+}
+
+cl_int WINAPI wine_clSetMemObjectDestructorCallback(cl_mem memobj, void WINAPI (*pfn_notify)(cl_mem, void*), void *user_data)
+{
+ /* FIXME: Based on PROGRAM_CALLBACK/program_fn_notify function. I'm not sure about this. */
+ cl_int ret;
+ FIXME("(%p, %p, %p)\n", memobj, pfn_notify, user_data);
+ if (!pclSetMemObjectDestructorCallback) return CL_INVALID_VALUE;
+ if(pfn_notify)
+ {
+ /* When pfn_notify is provided, clSetMemObjectDestructorCallback is asynchronous */
+ MEM_CALLBACK *pcb;
+ pcb = HeapAlloc(GetProcessHeap(), 0, sizeof(MEM_CALLBACK));
+ pcb->pfn_notify = pfn_notify;
+ pcb->user_data = user_data;
+ ret = pclSetMemObjectDestructorCallback(memobj, mem_fn_notify, user_data);
+ }
+ else
+ {
+ /* When pfn_notify is NULL, clSetMemObjectDestructorCallback is synchronous */
+ ret = pclSetMemObjectDestructorCallback(memobj, NULL, user_data);
+ }
+ FIXME("(%p, %p, %p)=%d\n", memobj, pfn_notify, user_data, ret);
+ return ret;
+}
+
/*---------------------------------------------------------------*/
/* Sampler APIs */
@@ -1009,6 +1096,68 @@ cl_int WINAPI wine_clReleaseEvent(cl_event event)
return ret;
}
+cl_event WINAPI wine_clCreateUserEvent(cl_context context, cl_int * errcode_ret)
+{
+ cl_event ret;
+ TRACE("\n");
+ if (!pclCreateUserEvent)
+ {
+ *errcode_ret = CL_INVALID_CONTEXT;
+ return NULL;
+ }
+ ret = pclCreateUserEvent(context, errcode_ret);
+ return ret;
+}
+
+typedef struct
+{
+ void WINAPI (*pfn_notify)(cl_event event, cl_int num, void* user_data);
+ void *user_data;
+} EVENT_CALLBACK;
+
+static void WINAPI event_fn_notify(cl_event event, cl_int num, void* user_data)
+{
+ EVENT_CALLBACK *ecb;
+ FIXME("(%p, %d, %p)\n", event, num, user_data);
+ ecb = (EVENT_CALLBACK *) user_data;
+ if(ecb->pfn_notify) ecb->pfn_notify(event, num, ecb->user_data);
+ FIXME("Callback COMPLETED\n");
+}
+
+cl_int WINAPI wine_clSetEventCallback(cl_event event, cl_int command_exec_callback_type,
+ void WINAPI (*pfn_notify)(cl_event, cl_int, void *), void *user_data)
+{
+ /* FIXME: Based on PROGRAM_CALLBACK/program_fn_notify function. I'm not sure about this. */
+ cl_int ret;
+ FIXME("(%p, %d, %p, %p)\n", event, command_exec_callback_type, pfn_notify, user_data);
+ if (!pclSetEventCallback) return CL_INVALID_EVENT;
+ if(pfn_notify)
+ {
+ /* When pfn_notify is provided, clSetEventCallback is asynchronous */
+ EVENT_CALLBACK *ecb;
+ ecb = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENT_CALLBACK));
+ ecb->pfn_notify = pfn_notify;
+ ecb->user_data = user_data;
+ ret = pclSetEventCallback(event, command_exec_callback_type, event_fn_notify, user_data);
+ }
+ else
+ {
+ /* When pfn_notify is NULL, clSetEventCallback is synchronous */
+ ret = pclSetEventCallback(event, command_exec_callback_type, NULL, user_data);
+ }
+ FIXME("(%p, %d, %p, %p)=%d\n", event, command_exec_callback_type, pfn_notify, user_data, ret);
+ return ret;
+}
+
+cl_int WINAPI wine_clSetUserEventStatus(cl_event event, cl_int execution_status)
+{
+ cl_int ret;
+ TRACE("\n");
+ if (!pclSetUserEventStatus) return CL_INVALID_EVENT;
+ ret = pclSetUserEventStatus(event, execution_status);
+ return ret;
+}
+
/*---------------------------------------------------------------*/
/* Profiling APIs */
@@ -1062,6 +1211,21 @@ cl_int WINAPI wine_clEnqueueReadBuffer(cl_command_queue command_queue, cl_mem bu
return ret;
}
+cl_int WINAPI wine_clEnqueueReadBufferRect(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read,
+ const size_t * buffer_origin, const size_t * host_origin, const size_t * region,
+ size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch,
+ void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event)
+{
+ cl_int ret;
+ TRACE("\n");
+ if (!pclEnqueueReadBufferRect) return CL_INVALID_VALUE;
+ ret = pclEnqueueReadBufferRect(command_queue, buffer, blocking_read,
+ buffer_origin, host_origin, region,
+ buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch,
+ ptr, num_events_in_wait_list, event_wait_list, event);
+ return ret;
+}
+
cl_int WINAPI wine_clEnqueueWriteBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write,
size_t offset, size_t cb, const void * ptr,
cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event)
@@ -1073,6 +1237,21 @@ cl_int WINAPI wine_clEnqueueWriteBuffer(cl_command_queue command_queue, cl_mem b
return ret;
}
+cl_int WINAPI wine_clEnqueueWriteBufferRect( cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read,
+ const size_t * buffer_origin, const size_t * host_origin, const size_t * region,
+ size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch,
+ const void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event)
+{
+ cl_int ret;
+ TRACE("\n");
+ if (!pclEnqueueWriteBufferRect) return CL_INVALID_VALUE;
+ ret = pclEnqueueWriteBufferRect(command_queue, buffer, blocking_read,
+ buffer_origin, host_origin, region,
+ buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch,
+ ptr, num_events_in_wait_list, event_wait_list, event);
+ return ret;
+}
+
cl_int WINAPI wine_clEnqueueCopyBuffer(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer,
size_t src_offset, size_t dst_offset, size_t cb,
cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event)
@@ -1084,6 +1263,19 @@ cl_int WINAPI wine_clEnqueueCopyBuffer(cl_command_queue command_queue, cl_mem sr
return ret;
}
+cl_int WINAPI wine_clEnqueueCopyBufferRect(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer,
+ const size_t * src_origin, const size_t * dst_origin, const size_t * region,
+ size_t src_row_pitch, size_t src_slice_pitch,
+ size_t dst_row_pitch, size_t dst_slice_pitch,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event)
+{
+ cl_int ret;
+ TRACE("\n");
+ if (!pclEnqueueCopyBufferRect) return CL_INVALID_VALUE;
+ ret = pclEnqueueCopyBufferRect(command_queue, src_buffer, dst_buffer, src_origin, dst_origin, region, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, num_events_in_wait_list, event_wait_list, event);
+ return ret;
+}
+
cl_int WINAPI wine_clEnqueueReadImage(cl_command_queue command_queue, cl_mem image, cl_bool blocking_read,
const size_t * origin, const size_t * region,
SIZE_T row_pitch, SIZE_T slice_pitch, void * ptr,
diff --git a/dlls/opencl/opencl.spec b/dlls/opencl/opencl.spec
index ba8ce6e7cd..4782653f3d 100644
--- a/dlls/opencl/opencl.spec
+++ b/dlls/opencl/opencl.spec
@@ -94,3 +94,13 @@
# @ stdcall clGetGLTextureInfo( long long long ptr ptr ) wine_clGetGLTextureInfo
# @ stdcall clEnqueueAcquireGLObjects( long long ptr long ptr ptr ) wine_clEnqueueAcquireGLObjects
# @ stdcall clEnqueueReleaseGLObjects( long long ptr long ptr ptr ) wine_clEnqueueReleaseGLObjects
+
+# OpenCL 1.1
+@ stdcall clCreateSubBuffer( long long long ptr ptr ) wine_clCreateSubBuffer
+@ stdcall clCreateUserEvent( long ptr ) wine_clCreateUserEvent
+@ stdcall clEnqueueCopyBufferRect( long long long ptr ptr ptr long long long long long ptr ptr ) wine_clEnqueueCopyBufferRect
+@ stdcall clEnqueueReadBufferRect( long long long ptr ptr ptr long long long long ptr long ptr ptr ) wine_clEnqueueReadBufferRect
+@ stdcall clEnqueueWriteBufferRect( long long long ptr ptr ptr long long long long ptr long ptr ptr ) wine_clEnqueueWriteBufferRect
+@ stdcall clSetEventCallback( long long ptr ptr ) wine_clSetEventCallback
+@ stdcall clSetMemObjectDestructorCallback( long ptr ptr ) wine_clSetMemObjectDestructorCallback
+@ stdcall clSetUserEventStatus( long long ) wine_clSetUserEventStatus
--
2.17.1
1
0
[PATCH v2 2/4] opencl: Use function pointer instead of call the function directly.
by Nakarin Khankham 08 Mar '19
by Nakarin Khankham 08 Mar '19
08 Mar '19
Signed-off-by: Nakarin Khankham <garuda2550(a)gmail.com>
---
dlls/opencl/opencl.c | 241 +++++++++++++++++++++++++++++++------------
1 file changed, 177 insertions(+), 64 deletions(-)
diff --git a/dlls/opencl/opencl.c b/dlls/opencl/opencl.c
index ad781b92b5..0dbc780279 100644
--- a/dlls/opencl/opencl.c
+++ b/dlls/opencl/opencl.c
@@ -371,7 +371,8 @@ cl_int WINAPI wine_clGetPlatformIDs(cl_uint num_entries, cl_platform_id *platfor
{
cl_int ret;
TRACE("(%d, %p, %p)\n", num_entries, platforms, num_platforms);
- ret = clGetPlatformIDs(num_entries, platforms, num_platforms);
+ if (!pclGetPlatformIDs) return CL_INVALID_VALUE;
+ ret = pclGetPlatformIDs(num_entries, platforms, num_platforms);
TRACE("(%d, %p, %p)=%d\n", num_entries, platforms, num_platforms, ret);
return ret;
}
@@ -382,6 +383,8 @@ cl_int WINAPI wine_clGetPlatformInfo(cl_platform_id platform, cl_platform_info p
cl_int ret;
TRACE("(%p, 0x%x, %ld, %p, %p)\n", platform, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetPlatformInfo) return CL_INVALID_VALUE;
+
/* Hide all extensions.
* TODO: Add individual extension support as needed.
*/
@@ -404,7 +407,7 @@ cl_int WINAPI wine_clGetPlatformInfo(cl_platform_id platform, cl_platform_info p
}
else
{
- ret = clGetPlatformInfo(platform, param_name, param_value_size, param_value, param_value_size_ret);
+ ret = pclGetPlatformInfo(platform, param_name, param_value_size, param_value, param_value_size_ret);
}
TRACE("(%p, 0x%x, %ld, %p, %p)=%d\n", platform, param_name, param_value_size, param_value, param_value_size_ret, ret);
@@ -420,7 +423,8 @@ cl_int WINAPI wine_clGetDeviceIDs(cl_platform_id platform, cl_device_type device
{
cl_int ret;
TRACE("(%p, 0x%lx, %d, %p, %p)\n", platform, (long unsigned int)device_type, num_entries, devices, num_devices);
- ret = clGetDeviceIDs(platform, device_type, num_entries, devices, num_devices);
+ if (!pclGetDeviceIDs) return CL_INVALID_VALUE;
+ ret = pclGetDeviceIDs(platform, device_type, num_entries, devices, num_devices);
TRACE("(%p, 0x%lx, %d, %p, %p)=%d\n", platform, (long unsigned int)device_type, num_entries, devices, num_devices, ret);
return ret;
}
@@ -431,6 +435,8 @@ cl_int WINAPI wine_clGetDeviceInfo(cl_device_id device, cl_device_info param_nam
cl_int ret;
TRACE("(%p, 0x%x, %ld, %p, %p)\n",device, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetDeviceInfo) return CL_INVALID_VALUE;
+
/* Hide all extensions.
* TODO: Add individual extension support as needed.
*/
@@ -453,7 +459,7 @@ cl_int WINAPI wine_clGetDeviceInfo(cl_device_id device, cl_device_info param_nam
}
else
{
- ret = clGetDeviceInfo(device, param_name, param_value_size, param_value, param_value_size_ret);
+ ret = pclGetDeviceInfo(device, param_name, param_value_size, param_value, param_value_size_ret);
}
/* Filter out the CL_EXEC_NATIVE_KERNEL flag */
@@ -493,6 +499,11 @@ cl_context WINAPI wine_clCreateContext(const cl_context_properties * properties,
cl_context ret;
CONTEXT_CALLBACK *ccb;
TRACE("(%p, %d, %p, %p, %p, %p)\n", properties, num_devices, devices, pfn_notify, user_data, errcode_ret);
+ if (!pclCreateContext)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
/* FIXME: The CONTEXT_CALLBACK structure is currently leaked.
* Pointers to callback redirectors should be remembered and free()d when the context is destroyed.
* The problem is determining when a context is being destroyed. clReleaseContext only decrements
@@ -502,7 +513,7 @@ cl_context WINAPI wine_clCreateContext(const cl_context_properties * properties,
ccb = HeapAlloc(GetProcessHeap(), 0, sizeof(CONTEXT_CALLBACK));
ccb->pfn_notify = pfn_notify;
ccb->user_data = user_data;
- ret = clCreateContext(properties, num_devices, devices, context_fn_notify, ccb, errcode_ret);
+ ret = pclCreateContext(properties, num_devices, devices, context_fn_notify, ccb, errcode_ret);
TRACE("(%p, %d, %p, %p, %p, %p (%d)))=%p\n", properties, num_devices, devices, &pfn_notify, user_data, errcode_ret, errcode_ret ? *errcode_ret : 0, ret);
return ret;
}
@@ -514,6 +525,11 @@ cl_context WINAPI wine_clCreateContextFromType(const cl_context_properties * pro
cl_context ret;
CONTEXT_CALLBACK *ccb;
TRACE("(%p, 0x%lx, %p, %p, %p)\n", properties, (long unsigned int)device_type, pfn_notify, user_data, errcode_ret);
+ if (!pclCreateContextFromType)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
/* FIXME: The CONTEXT_CALLBACK structure is currently leaked.
* Pointers to callback redirectors should be remembered and free()d when the context is destroyed.
* The problem is determining when a context is being destroyed. clReleaseContext only decrements
@@ -523,7 +539,7 @@ cl_context WINAPI wine_clCreateContextFromType(const cl_context_properties * pro
ccb = HeapAlloc(GetProcessHeap(), 0, sizeof(CONTEXT_CALLBACK));
ccb->pfn_notify = pfn_notify;
ccb->user_data = user_data;
- ret = clCreateContextFromType(properties, device_type, context_fn_notify, ccb, errcode_ret);
+ ret = pclCreateContextFromType(properties, device_type, context_fn_notify, ccb, errcode_ret);
TRACE("(%p, 0x%lx, %p, %p, %p (%d)))=%p\n", properties, (long unsigned int)device_type, pfn_notify, user_data, errcode_ret, errcode_ret ? *errcode_ret : 0, ret);
return ret;
}
@@ -532,7 +548,8 @@ cl_int WINAPI wine_clRetainContext(cl_context context)
{
cl_int ret;
TRACE("(%p)\n", context);
- ret = clRetainContext(context);
+ if (!pclRetainContext) return CL_INVALID_VALUE;
+ ret = pclRetainContext(context);
TRACE("(%p)=%d\n", context, ret);
return ret;
}
@@ -541,7 +558,8 @@ cl_int WINAPI wine_clReleaseContext(cl_context context)
{
cl_int ret;
TRACE("(%p)\n", context);
- ret = clReleaseContext(context);
+ if (!pclReleaseContext) return CL_INVALID_VALUE;
+ ret = pclReleaseContext(context);
TRACE("(%p)=%d\n", context, ret);
return ret;
}
@@ -551,7 +569,8 @@ cl_int WINAPI wine_clGetContextInfo(cl_context context, cl_context_info param_na
{
cl_int ret;
TRACE("(%p, 0x%x, %ld, %p, %p)\n", context, param_name, param_value_size, param_value, param_value_size_ret);
- ret = clGetContextInfo(context, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetContextInfo) return CL_INVALID_VALUE;
+ ret = pclGetContextInfo(context, param_name, param_value_size, param_value, param_value_size_ret);
TRACE("(%p, 0x%x, %ld, %p, %p)=%d\n", context, param_name, param_value_size, param_value, param_value_size_ret, ret);
return ret;
}
@@ -565,7 +584,12 @@ cl_command_queue WINAPI wine_clCreateCommandQueue(cl_context context, cl_device_
{
cl_command_queue ret;
TRACE("(%p, %p, 0x%lx, %p)\n", context, device, (long unsigned int)properties, errcode_ret);
- ret = clCreateCommandQueue(context, device, properties, errcode_ret);
+ if (!pclCreateCommandQueue)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateCommandQueue(context, device, properties, errcode_ret);
TRACE("(%p, %p, 0x%lx, %p)=%p\n", context, device, (long unsigned int)properties, errcode_ret, ret);
return ret;
}
@@ -574,7 +598,8 @@ cl_int WINAPI wine_clRetainCommandQueue(cl_command_queue command_queue)
{
cl_int ret;
TRACE("(%p)\n", command_queue);
- ret = clRetainCommandQueue(command_queue);
+ if (!pclRetainCommandQueue) return CL_INVALID_VALUE;
+ ret = pclRetainCommandQueue(command_queue);
TRACE("(%p)=%d\n", command_queue, ret);
return ret;
}
@@ -583,7 +608,8 @@ cl_int WINAPI wine_clReleaseCommandQueue(cl_command_queue command_queue)
{
cl_int ret;
TRACE("(%p)\n", command_queue);
- ret = clReleaseCommandQueue(command_queue);
+ if (!pclReleaseCommandQueue) return CL_INVALID_VALUE;
+ ret = pclReleaseCommandQueue(command_queue);
TRACE("(%p)=%d\n", command_queue, ret);
return ret;
}
@@ -593,7 +619,8 @@ cl_int WINAPI wine_clGetCommandQueueInfo(cl_command_queue command_queue, cl_comm
{
cl_int ret;
TRACE("%p, %d, %ld, %p, %p\n", command_queue, param_name, param_value_size, param_value, param_value_size_ret);
- ret = clGetCommandQueueInfo(command_queue, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetCommandQueueInfo) return CL_INVALID_VALUE;
+ ret = pclGetCommandQueueInfo(command_queue, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -612,7 +639,12 @@ cl_mem WINAPI wine_clCreateBuffer(cl_context context, cl_mem_flags flags, size_t
{
cl_mem ret;
TRACE("\n");
- ret = clCreateBuffer(context, flags, size, host_ptr, errcode_ret);
+ if (!pclCreateBuffer)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateBuffer(context, flags, size, host_ptr, errcode_ret);
return ret;
}
@@ -621,7 +653,12 @@ cl_mem WINAPI wine_clCreateImage2D(cl_context context, cl_mem_flags flags, cl_im
{
cl_mem ret;
TRACE("\n");
- ret = clCreateImage2D(context, flags, image_format, image_width, image_height, image_row_pitch, host_ptr, errcode_ret);
+ if (!pclCreateImage2D)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateImage2D(context, flags, image_format, image_width, image_height, image_row_pitch, host_ptr, errcode_ret);
return ret;
}
@@ -631,7 +668,12 @@ cl_mem WINAPI wine_clCreateImage3D(cl_context context, cl_mem_flags flags, cl_im
{
cl_mem ret;
TRACE("\n");
- ret = clCreateImage3D(context, flags, image_format, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, host_ptr, errcode_ret);
+ if (!pclCreateImage3D)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateImage3D(context, flags, image_format, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, host_ptr, errcode_ret);
return ret;
}
@@ -639,7 +681,8 @@ cl_int WINAPI wine_clRetainMemObject(cl_mem memobj)
{
cl_int ret;
TRACE("(%p)\n", memobj);
- ret = clRetainMemObject(memobj);
+ if (!pclRetainMemObject) return CL_INVALID_VALUE;
+ ret = pclRetainMemObject(memobj);
TRACE("(%p)=%d\n", memobj, ret);
return ret;
}
@@ -648,7 +691,8 @@ cl_int WINAPI wine_clReleaseMemObject(cl_mem memobj)
{
cl_int ret;
TRACE("(%p)\n", memobj);
- ret = clReleaseMemObject(memobj);
+ if (!pclReleaseMemObject) return CL_INVALID_VALUE;
+ ret = pclReleaseMemObject(memobj);
TRACE("(%p)=%d\n", memobj, ret);
return ret;
}
@@ -658,7 +702,8 @@ cl_int WINAPI wine_clGetSupportedImageFormats(cl_context context, cl_mem_flags f
{
cl_int ret;
TRACE("\n");
- ret = clGetSupportedImageFormats(context, flags, image_type, num_entries, image_formats, num_image_formats);
+ if (!pclGetSupportedImageFormats) return CL_INVALID_VALUE;
+ ret = pclGetSupportedImageFormats(context, flags, image_type, num_entries, image_formats, num_image_formats);
return ret;
}
@@ -666,7 +711,8 @@ cl_int WINAPI wine_clGetMemObjectInfo(cl_mem memobj, cl_mem_info param_name, siz
{
cl_int ret;
TRACE("\n");
- ret = clGetMemObjectInfo(memobj, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetMemObjectInfo) return CL_INVALID_VALUE;
+ ret = pclGetMemObjectInfo(memobj, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -674,7 +720,8 @@ cl_int WINAPI wine_clGetImageInfo(cl_mem image, cl_image_info param_name, size_t
{
cl_int ret;
TRACE("\n");
- ret = clGetImageInfo(image, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetImageInfo) return CL_INVALID_VALUE;
+ ret = pclGetImageInfo(image, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -687,7 +734,12 @@ cl_sampler WINAPI wine_clCreateSampler(cl_context context, cl_bool normalized_co
{
cl_sampler ret;
TRACE("\n");
- ret = clCreateSampler(context, normalized_coords, addressing_mode, filter_mode, errcode_ret);
+ if (!pclCreateSampler)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateSampler(context, normalized_coords, addressing_mode, filter_mode, errcode_ret);
return ret;
}
@@ -695,7 +747,8 @@ cl_int WINAPI wine_clRetainSampler(cl_sampler sampler)
{
cl_int ret;
TRACE("\n");
- ret = clRetainSampler(sampler);
+ if (!pclRetainSampler) return CL_INVALID_VALUE;
+ ret = pclRetainSampler(sampler);
return ret;
}
@@ -703,7 +756,8 @@ cl_int WINAPI wine_clReleaseSampler(cl_sampler sampler)
{
cl_int ret;
TRACE("\n");
- ret = clReleaseSampler(sampler);
+ if (!pclReleaseSampler) return CL_INVALID_VALUE;
+ ret = pclReleaseSampler(sampler);
return ret;
}
@@ -712,7 +766,8 @@ cl_int WINAPI wine_clGetSamplerInfo(cl_sampler sampler, cl_sampler_info param_na
{
cl_int ret;
TRACE("\n");
- ret = clGetSamplerInfo(sampler, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetSamplerInfo) return CL_INVALID_VALUE;
+ ret = pclGetSamplerInfo(sampler, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -725,7 +780,12 @@ cl_program WINAPI wine_clCreateProgramWithSource(cl_context context, cl_uint cou
{
cl_program ret;
TRACE("\n");
- ret = clCreateProgramWithSource(context, count, strings, lengths, errcode_ret);
+ if (!pclCreateProgramWithSource)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateProgramWithSource(context, count, strings, lengths, errcode_ret);
return ret;
}
@@ -735,7 +795,12 @@ cl_program WINAPI wine_clCreateProgramWithBinary(cl_context context, cl_uint num
{
cl_program ret;
TRACE("\n");
- ret = clCreateProgramWithBinary(context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret);
+ if (!pclCreateProgramWithBinary)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateProgramWithBinary(context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret);
return ret;
}
@@ -743,7 +808,8 @@ cl_int WINAPI wine_clRetainProgram(cl_program program)
{
cl_int ret;
TRACE("\n");
- ret = clRetainProgram(program);
+ if (!pclRetainProgram) return CL_INVALID_PROGRAM;
+ ret = pclRetainProgram(program);
return ret;
}
@@ -751,7 +817,8 @@ cl_int WINAPI wine_clReleaseProgram(cl_program program)
{
cl_int ret;
TRACE("\n");
- ret = clReleaseProgram(program);
+ if (!pclReleaseProgram) return CL_INVALID_PROGRAM;
+ ret = pclReleaseProgram(program);
return ret;
}
@@ -777,6 +844,7 @@ cl_int WINAPI wine_clBuildProgram(cl_program program, cl_uint num_devices, const
{
cl_int ret;
TRACE("\n");
+ if (!pclBuildProgram) return CL_INVALID_VALUE;
if(pfn_notify)
{
/* When pfn_notify is provided, clBuildProgram is asynchronous */
@@ -784,12 +852,12 @@ cl_int WINAPI wine_clBuildProgram(cl_program program, cl_uint num_devices, const
pcb = HeapAlloc(GetProcessHeap(), 0, sizeof(PROGRAM_CALLBACK));
pcb->pfn_notify = pfn_notify;
pcb->user_data = user_data;
- ret = clBuildProgram(program, num_devices, device_list, options, program_fn_notify, pcb);
+ ret = pclBuildProgram(program, num_devices, device_list, options, program_fn_notify, pcb);
}
else
{
/* When pfn_notify is NULL, clBuildProgram is synchronous */
- ret = clBuildProgram(program, num_devices, device_list, options, NULL, user_data);
+ ret = pclBuildProgram(program, num_devices, device_list, options, NULL, user_data);
}
return ret;
}
@@ -798,7 +866,8 @@ cl_int WINAPI wine_clUnloadCompiler(void)
{
cl_int ret;
TRACE("()\n");
- ret = clUnloadCompiler();
+ if (!pclUnloadCompiler) return CL_SUCCESS;
+ ret = pclUnloadCompiler();
TRACE("()=%d\n", ret);
return ret;
}
@@ -808,7 +877,8 @@ cl_int WINAPI wine_clGetProgramInfo(cl_program program, cl_program_info param_na
{
cl_int ret;
TRACE("\n");
- ret = clGetProgramInfo(program, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetProgramInfo) return CL_INVALID_VALUE;
+ ret = pclGetProgramInfo(program, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -818,7 +888,8 @@ cl_int WINAPI wine_clGetProgramBuildInfo(cl_program program, cl_device_id device
{
cl_int ret;
TRACE("\n");
- ret = clGetProgramBuildInfo(program, device, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetProgramBuildInfo) return CL_INVALID_VALUE;
+ ret = pclGetProgramBuildInfo(program, device, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -830,7 +901,12 @@ cl_kernel WINAPI wine_clCreateKernel(cl_program program, char * kernel_name, cl_
{
cl_kernel ret;
TRACE("\n");
- ret = clCreateKernel(program, kernel_name, errcode_ret);
+ if (!pclCreateKernel)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclCreateKernel(program, kernel_name, errcode_ret);
return ret;
}
@@ -839,7 +915,8 @@ cl_int WINAPI wine_clCreateKernelsInProgram(cl_program program, cl_uint num_kern
{
cl_int ret;
TRACE("\n");
- ret = clCreateKernelsInProgram(program, num_kernels, kernels, num_kernels_ret);
+ if (!pclCreateKernelsInProgram) return CL_INVALID_VALUE;
+ ret = pclCreateKernelsInProgram(program, num_kernels, kernels, num_kernels_ret);
return ret;
}
@@ -847,7 +924,8 @@ cl_int WINAPI wine_clRetainKernel(cl_kernel kernel)
{
cl_int ret;
TRACE("\n");
- ret = clRetainKernel(kernel);
+ if (!pclRetainKernel) return CL_INVALID_KERNEL;
+ ret = pclRetainKernel(kernel);
return ret;
}
@@ -855,7 +933,8 @@ cl_int WINAPI wine_clReleaseKernel(cl_kernel kernel)
{
cl_int ret;
TRACE("\n");
- ret = clReleaseKernel(kernel);
+ if (!pclReleaseKernel) return CL_INVALID_KERNEL;
+ ret = pclReleaseKernel(kernel);
return ret;
}
@@ -863,7 +942,8 @@ cl_int WINAPI wine_clSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t ar
{
cl_int ret;
TRACE("\n");
- ret = clSetKernelArg(kernel, arg_index, arg_size, arg_value);
+ if (!pclSetKernelArg) return CL_INVALID_KERNEL;
+ ret = pclSetKernelArg(kernel, arg_index, arg_size, arg_value);
return ret;
}
@@ -872,7 +952,8 @@ cl_int WINAPI wine_clGetKernelInfo(cl_kernel kernel, cl_kernel_info param_name,
{
cl_int ret;
TRACE("\n");
- ret = clGetKernelInfo(kernel, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetKernelInfo) return CL_INVALID_VALUE;
+ ret = pclGetKernelInfo(kernel, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -882,7 +963,8 @@ cl_int WINAPI wine_clGetKernelWorkGroupInfo(cl_kernel kernel, cl_device_id devic
{
cl_int ret;
TRACE("\n");
- ret = clGetKernelWorkGroupInfo(kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetKernelWorkGroupInfo) return CL_INVALID_VALUE;
+ ret = pclGetKernelWorkGroupInfo(kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -894,7 +976,8 @@ cl_int WINAPI wine_clWaitForEvents(cl_uint num_events, cl_event * event_list)
{
cl_int ret;
TRACE("\n");
- ret = clWaitForEvents(num_events, event_list);
+ if (!pclWaitForEvents) return CL_INVALID_EVENT;
+ ret = pclWaitForEvents(num_events, event_list);
return ret;
}
@@ -903,7 +986,8 @@ cl_int WINAPI wine_clGetEventInfo(cl_event event, cl_event_info param_name, size
{
cl_int ret;
TRACE("\n");
- ret = clGetEventInfo(event, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetEventInfo) return CL_INVALID_EVENT;
+ ret = pclGetEventInfo(event, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -911,7 +995,8 @@ cl_int WINAPI wine_clRetainEvent(cl_event event)
{
cl_int ret;
TRACE("\n");
- ret = clRetainEvent(event);
+ if (!pclRetainEvent) return CL_INVALID_EVENT;
+ ret = pclRetainEvent(event);
return ret;
}
@@ -919,7 +1004,8 @@ cl_int WINAPI wine_clReleaseEvent(cl_event event)
{
cl_int ret;
TRACE("\n");
- ret = clReleaseEvent(event);
+ if (!pclReleaseEvent) return CL_INVALID_EVENT;
+ ret = pclReleaseEvent(event);
return ret;
}
@@ -932,7 +1018,8 @@ cl_int WINAPI wine_clGetEventProfilingInfo(cl_event event, cl_profiling_info par
{
cl_int ret;
TRACE("\n");
- ret = clGetEventProfilingInfo(event, param_name, param_value_size, param_value, param_value_size_ret);
+ if (!pclGetEventProfilingInfo) return CL_INVALID_EVENT;
+ ret = pclGetEventProfilingInfo(event, param_name, param_value_size, param_value, param_value_size_ret);
return ret;
}
@@ -944,7 +1031,8 @@ cl_int WINAPI wine_clFlush(cl_command_queue command_queue)
{
cl_int ret;
TRACE("(%p)\n", command_queue);
- ret = clFlush(command_queue);
+ if (!pclFlush) return CL_INVALID_COMMAND_QUEUE;
+ ret = pclFlush(command_queue);
TRACE("(%p)=%d\n", command_queue, ret);
return ret;
}
@@ -953,7 +1041,8 @@ cl_int WINAPI wine_clFinish(cl_command_queue command_queue)
{
cl_int ret;
TRACE("(%p)\n", command_queue);
- ret = clFinish(command_queue);
+ if (!pclFinish) return CL_INVALID_COMMAND_QUEUE;
+ ret = pclFinish(command_queue);
TRACE("(%p)=%d\n", command_queue, ret);
return ret;
}
@@ -968,7 +1057,8 @@ cl_int WINAPI wine_clEnqueueReadBuffer(cl_command_queue command_queue, cl_mem bu
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueReadBuffer(command_queue, buffer, blocking_read, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueReadBuffer) return CL_INVALID_VALUE;
+ ret = pclEnqueueReadBuffer(command_queue, buffer, blocking_read, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -978,7 +1068,8 @@ cl_int WINAPI wine_clEnqueueWriteBuffer(cl_command_queue command_queue, cl_mem b
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueWriteBuffer(command_queue, buffer, blocking_write, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueWriteBuffer) return CL_INVALID_VALUE;
+ ret = pclEnqueueWriteBuffer(command_queue, buffer, blocking_write, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -988,7 +1079,8 @@ cl_int WINAPI wine_clEnqueueCopyBuffer(cl_command_queue command_queue, cl_mem sr
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueCopyBuffer(command_queue, src_buffer, dst_buffer, src_offset, dst_offset, cb, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueCopyBuffer) return CL_INVALID_VALUE;
+ ret = pclEnqueueCopyBuffer(command_queue, src_buffer, dst_buffer, src_offset, dst_offset, cb, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1000,7 +1092,8 @@ cl_int WINAPI wine_clEnqueueReadImage(cl_command_queue command_queue, cl_mem ima
cl_int ret;
TRACE("(%p, %p, %d, %p, %p, %ld, %ld, %p, %d, %p, %p)\n", command_queue, image, blocking_read,
origin, region, row_pitch, slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event);
- ret = clEnqueueReadImage(command_queue, image, blocking_read, origin, region, row_pitch, slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueReadImage) return CL_INVALID_VALUE;
+ ret = pclEnqueueReadImage(command_queue, image, blocking_read, origin, region, row_pitch, slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event);
TRACE("(%p, %p, %d, %p, %p, %ld, %ld, %p, %d, %p, %p)=%d\n", command_queue, image, blocking_read,
origin, region, row_pitch, slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event, ret);
return ret;
@@ -1013,7 +1106,8 @@ cl_int WINAPI wine_clEnqueueWriteImage(cl_command_queue command_queue, cl_mem im
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueWriteImage(command_queue, image, blocking_write, origin, region, input_row_pitch, input_slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueWriteImage) return CL_INVALID_VALUE;
+ ret = pclEnqueueWriteImage(command_queue, image, blocking_write, origin, region, input_row_pitch, input_slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1023,7 +1117,8 @@ cl_int WINAPI wine_clEnqueueCopyImage(cl_command_queue command_queue, cl_mem src
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueCopyImage(command_queue, src_image, dst_image, src_origin, dst_origin, region, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueCopyImage) return CL_INVALID_VALUE;
+ ret = pclEnqueueCopyImage(command_queue, src_image, dst_image, src_origin, dst_origin, region, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1033,7 +1128,8 @@ cl_int WINAPI wine_clEnqueueCopyImageToBuffer(cl_command_queue command_queue, cl
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueCopyImageToBuffer(command_queue, src_image, dst_buffer, src_origin, region, dst_offset, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueCopyImageToBuffer) return CL_INVALID_VALUE;
+ ret = pclEnqueueCopyImageToBuffer(command_queue, src_image, dst_buffer, src_origin, region, dst_offset, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1043,7 +1139,8 @@ cl_int WINAPI wine_clEnqueueCopyBufferToImage(cl_command_queue command_queue, cl
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueCopyBufferToImage(command_queue, src_buffer, dst_image, src_offset, dst_origin, region, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueCopyBufferToImage) return CL_INVALID_VALUE;
+ ret = pclEnqueueCopyBufferToImage(command_queue, src_buffer, dst_image, src_offset, dst_origin, region, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1053,7 +1150,12 @@ void * WINAPI wine_clEnqueueMapBuffer(cl_command_queue command_queue, cl_mem buf
{
void * ret;
TRACE("\n");
- ret = clEnqueueMapBuffer(command_queue, buffer, blocking_map, map_flags, offset, cb, num_events_in_wait_list, event_wait_list, event, errcode_ret);
+ if (!pclEnqueueMapBuffer)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclEnqueueMapBuffer(command_queue, buffer, blocking_map, map_flags, offset, cb, num_events_in_wait_list, event_wait_list, event, errcode_ret);
return ret;
}
@@ -1064,7 +1166,12 @@ void * WINAPI wine_clEnqueueMapImage(cl_command_queue command_queue, cl_mem imag
{
void * ret;
TRACE("\n");
- ret = clEnqueueMapImage(command_queue, image, blocking_map, map_flags, origin, region, image_row_pitch, image_slice_pitch, num_events_in_wait_list, event_wait_list, event, errcode_ret);
+ if (!pclEnqueueMapImage)
+ {
+ *errcode_ret = CL_INVALID_VALUE;
+ return NULL;
+ }
+ ret = pclEnqueueMapImage(command_queue, image, blocking_map, map_flags, origin, region, image_row_pitch, image_slice_pitch, num_events_in_wait_list, event_wait_list, event, errcode_ret);
return ret;
}
@@ -1073,7 +1180,8 @@ cl_int WINAPI wine_clEnqueueUnmapMemObject(cl_command_queue command_queue, cl_me
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueUnmapMemObject(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueUnmapMemObject) return CL_INVALID_VALUE;
+ ret = pclEnqueueUnmapMemObject(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1083,7 +1191,8 @@ cl_int WINAPI wine_clEnqueueNDRangeKernel(cl_command_queue command_queue, cl_ker
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueNDRangeKernel(command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueNDRangeKernel) return CL_INVALID_VALUE;
+ ret = pclEnqueueNDRangeKernel(command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1092,7 +1201,8 @@ cl_int WINAPI wine_clEnqueueTask(cl_command_queue command_queue, cl_kernel kerne
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueTask(command_queue, kernel, num_events_in_wait_list, event_wait_list, event);
+ if (!pclEnqueueTask) return CL_INVALID_VALUE;
+ ret = pclEnqueueTask(command_queue, kernel, num_events_in_wait_list, event_wait_list, event);
return ret;
}
@@ -1121,7 +1231,8 @@ cl_int WINAPI wine_clEnqueueMarker(cl_command_queue command_queue, cl_event * ev
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueMarker(command_queue, event);
+ if (!pclEnqueueMarker) return CL_INVALID_VALUE;
+ ret = pclEnqueueMarker(command_queue, event);
return ret;
}
@@ -1129,7 +1240,8 @@ cl_int WINAPI wine_clEnqueueWaitForEvents(cl_command_queue command_queue, cl_uin
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueWaitForEvents(command_queue, num_events, event_list);
+ if (!pclEnqueueWaitForEvents) return CL_INVALID_VALUE;
+ ret = pclEnqueueWaitForEvents(command_queue, num_events, event_list);
return ret;
}
@@ -1137,7 +1249,8 @@ cl_int WINAPI wine_clEnqueueBarrier(cl_command_queue command_queue)
{
cl_int ret;
TRACE("\n");
- ret = clEnqueueBarrier(command_queue);
+ if (!pclEnqueueBarrier) return CL_INVALID_VALUE;
+ ret = pclEnqueueBarrier(command_queue);
return ret;
}
--
2.17.1
1
0
08 Mar '19
Signed-off-by: Nakarin Khankham <garuda2550(a)gmail.com>
---
configure | 56 ++++++++
configure.ac | 1 +
dlls/opencl/opencl.c | 321 +++++++++++++++++++++++++++++++++++++++++++
include/config.h.in | 3 +
4 files changed, 381 insertions(+)
diff --git a/configure b/configure
index 5f9aca9bd4..8e4ccc8209 100755
--- a/configure
+++ b/configure
@@ -11809,6 +11809,62 @@ if test "x$ac_cv_lib_OpenCL_clGetPlatformInfo" = xyes; then :
fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lOpenCL" >&5
+$as_echo_n "checking for -lOpenCL... " >&6; }
+if ${ac_cv_lib_soname_OpenCL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_soname_save_LIBS=$LIBS
+LIBS="-lOpenCL $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clGetPlatformInfo ();
+int
+main ()
+{
+return clGetPlatformInfo ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ case "$LIBEXT" in
+ dll) ac_cv_lib_soname_OpenCL=`$ac_cv_path_LDD conftest.exe | grep "OpenCL" | sed -e "s/dll.*/dll/"';2,$d'` ;;
+ dylib) ac_cv_lib_soname_OpenCL=`$OTOOL -L conftest$ac_exeext | grep "libOpenCL\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libOpenCL\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
+ *) ac_cv_lib_soname_OpenCL=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libOpenCL\\.$LIBEXT" | sed -e "s/^.*\\[\\(libOpenCL\\.$LIBEXT[^ ]*\\)\\].*$/\1/"';2,$d'`
+ if ${ac_cv_lib_soname_OpenCL:+false} :; then :
+ ac_cv_lib_soname_OpenCL=`$LDD conftest$ac_exeext | grep "libOpenCL\\.$LIBEXT" | sed -e "s/^.*\(libOpenCL\.$LIBEXT[^ ]*\).*$/\1/"';2,$d'`
+fi ;;
+ esac
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_soname_save_LIBS
+fi
+if ${ac_cv_lib_soname_OpenCL:+false} :; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+ cat >>confdefs.h <<_ACEOF
+#define SONAME_LIBOPENCL "libOpenCL.$LIBEXT"
+_ACEOF
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_OpenCL" >&5
+$as_echo "$ac_cv_lib_soname_OpenCL" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SONAME_LIBOPENCL "$ac_cv_lib_soname_OpenCL"
+_ACEOF
+
+
+fi
fi
if test "x$ac_cv_lib_OpenCL_clGetPlatformInfo" != xyes; then :
case "x$with_opencl" in
diff --git a/configure.ac b/configure.ac
index a55d2f825a..8c8bbc1704 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1264,6 +1264,7 @@ dnl **** Check for OpenCL ****
if test "$ac_cv_header_CL_cl_h" = "yes"
then
AC_CHECK_LIB(OpenCL,clGetPlatformInfo,[AC_SUBST(OPENCL_LIBS,["-lOpenCL"])])
+ WINE_CHECK_SONAME(OpenCL,clGetPlatformInfo,,[AC_DEFINE_UNQUOTED(SONAME_LIBOPENCL,["libOpenCL.$LIBEXT"])])
fi
WINE_NOTICE_WITH(opencl,[test "x$ac_cv_lib_OpenCL_clGetPlatformInfo" != xyes],
[OpenCL ${notice_platform}development files not found, OpenCL won't be supported.],
diff --git a/dlls/opencl/opencl.c b/dlls/opencl/opencl.c
index 2d145bf25c..ad781b92b5 100644
--- a/dlls/opencl/opencl.c
+++ b/dlls/opencl/opencl.c
@@ -43,6 +43,327 @@ WINE_DEFAULT_DEBUG_CHANNEL(opencl);
#define OPENCL_WITH_GL 0
+/* Platform API */
+static cl_int (*pclGetPlatformIDs)(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms);
+static cl_int (*pclGetPlatformInfo)(cl_platform_id platform, cl_platform_info param_name,
+ SIZE_T param_value_size, void * param_value, size_t * param_value_size_ret);
+
+/* Device APIs */
+static cl_int (*pclGetDeviceIDs)(cl_platform_id platform, cl_device_type device_type,
+ cl_uint num_entries, cl_device_id * devices, cl_uint * num_devices);
+static cl_int (*pclGetDeviceInfo)(cl_device_id device, cl_device_info param_name,
+ SIZE_T param_value_size, void * param_value, size_t * param_value_size_ret);
+
+/* Context APIs */
+static cl_context (*pclCreateContext)(const cl_context_properties * properties, cl_uint num_devices, const cl_device_id * devices,
+ void WINAPI (*pfn_notify)(const char *errinfo, const void *private_info, size_t cb, void *user_data),
+ void * user_data, cl_int * errcode_ret);
+static cl_context (*pclCreateContextFromType)(const cl_context_properties * properties, cl_device_type device_type,
+ void WINAPI (*pfn_notify)(const char *errinfo, const void *private_info, size_t cb, void *user_data),
+ void * user_data, cl_int * errcode_ret);
+static cl_int (*pclRetainContext)(cl_context context);
+static cl_int (*pclReleaseContext)(cl_context context);
+static cl_int (*pclGetContextInfo)(cl_context context, cl_context_info param_name,
+ SIZE_T param_value_size, void * param_value, size_t * param_value_size_ret);
+
+/* Command Queue APIs */
+static cl_command_queue (*pclCreateCommandQueue)(cl_context context, cl_device_id device,
+ cl_command_queue_properties properties, cl_int * errcode_ret);
+static cl_int (*pclRetainCommandQueue)(cl_command_queue command_queue);
+static cl_int (*pclReleaseCommandQueue)(cl_command_queue command_queue);
+static cl_int (*pclGetCommandQueueInfo)(cl_command_queue command_queue, cl_command_queue_info param_name,
+ SIZE_T param_value_size, void * param_value, size_t * param_value_size_ret);
+static cl_int (*pclSetCommandQueueProperty)(cl_command_queue command_queue, cl_command_queue_properties properties, cl_bool enable,
+ cl_command_queue_properties * old_properties);
+
+/* Memory Object APIs */
+static cl_mem (*pclCreateBuffer)(cl_context context, cl_mem_flags flags, size_t size, void * host_ptr, cl_int * errcode_ret);
+static cl_mem (*pclCreateImage2D)(cl_context context, cl_mem_flags flags, cl_image_format * image_format,
+ size_t image_width, size_t image_height, size_t image_row_pitch, void * host_ptr, cl_int * errcode_ret);
+static cl_mem (*pclCreateImage3D)(cl_context context, cl_mem_flags flags, cl_image_format * image_format,
+ size_t image_width, size_t image_height, size_t image_depth, size_t image_row_pitch, size_t image_slice_pitch,
+ void * host_ptr, cl_int * errcode_ret);
+static cl_int (*pclRetainMemObject)(cl_mem memobj);
+static cl_int (*pclReleaseMemObject)(cl_mem memobj);
+static cl_int (*pclGetSupportedImageFormats)(cl_context context, cl_mem_flags flags, cl_mem_object_type image_type, cl_uint num_entries,
+ cl_image_format * image_formats, cl_uint * num_image_formats);
+static cl_int (*pclGetMemObjectInfo)(cl_mem memobj, cl_mem_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret);
+static cl_int (*pclGetImageInfo)(cl_mem image, cl_image_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret);
+
+/* Sampler APIs */
+static cl_sampler (*pclCreateSampler)(cl_context context, cl_bool normalized_coords, cl_addressing_mode addressing_mode,
+ cl_filter_mode filter_mode, cl_int * errcode_ret);
+static cl_int (*pclRetainSampler)(cl_sampler sampler);
+static cl_int (*pclReleaseSampler)(cl_sampler sampler);
+static cl_int (*pclGetSamplerInfo)(cl_sampler sampler, cl_sampler_info param_name, size_t param_value_size,
+ void * param_value, size_t * param_value_size_ret);
+
+/* Program Object APIs */
+static cl_program (*pclCreateProgramWithSource)(cl_context context, cl_uint count, const char ** strings,
+ const size_t * lengths, cl_int * errcode_ret);
+static cl_program (*pclCreateProgramWithBinary)(cl_context context, cl_uint num_devices, const cl_device_id * device_list,
+ const size_t * lengths, const unsigned char ** binaries, cl_int * binary_status,
+ cl_int * errcode_ret);
+static cl_int (*pclRetainProgram)(cl_program program);
+static cl_int (*pclReleaseProgram)(cl_program program);
+static cl_int (*pclBuildProgram)(cl_program program, cl_uint num_devices, const cl_device_id * device_list, const char * options,
+ void WINAPI (*pfn_notify)(cl_program program, void * user_data),
+ void * user_data);
+static cl_int (*pclUnloadCompiler)(void);
+static cl_int (*pclGetProgramInfo)(cl_program program, cl_program_info param_name,
+ size_t param_value_size, void * param_value, size_t * param_value_size_ret);
+static cl_int (*pclGetProgramBuildInfo)(cl_program program, cl_device_id device,
+ cl_program_build_info param_name, size_t param_value_size, void * param_value,
+ size_t * param_value_size_ret);
+
+/* Kernel Object APIs */
+static cl_kernel (*pclCreateKernel)(cl_program program, char * kernel_name, cl_int * errcode_ret);
+static cl_int (*pclCreateKernelsInProgram)(cl_program program, cl_uint num_kernels,
+ cl_kernel * kernels, cl_uint * num_kernels_ret);
+static cl_int (*pclRetainKernel)(cl_kernel kernel);
+static cl_int (*pclReleaseKernel)(cl_kernel kernel);
+static cl_int (*pclSetKernelArg)(cl_kernel kernel, cl_uint arg_index, size_t arg_size, void * arg_value);
+static cl_int (*pclGetKernelInfo)(cl_kernel kernel, cl_kernel_info param_name,
+ size_t param_value_size, void * param_value, size_t * param_value_size_ret);
+static cl_int (*pclGetKernelWorkGroupInfo)(cl_kernel kernel, cl_device_id device,
+ cl_kernel_work_group_info param_name, size_t param_value_size,
+ void * param_value, size_t * param_value_size_ret);
+/* Event Object APIs */
+static cl_int (*pclWaitForEvents)(cl_uint num_events, cl_event * event_list);
+static cl_int (*pclGetEventInfo)(cl_event event, cl_event_info param_name, size_t param_value_size,
+ void * param_value, size_t * param_value_size_ret);
+static cl_int (*pclRetainEvent)(cl_event event);
+static cl_int (*pclReleaseEvent)(cl_event event);
+
+/* Profiling APIs */
+static cl_int (*pclGetEventProfilingInfo)(cl_event event, cl_profiling_info param_name, size_t param_value_size,
+ void * param_value, size_t * param_value_size_ret);
+
+/* Flush and Finish APIs */
+static cl_int (*pclFlush)(cl_command_queue command_queue);
+static cl_int (*pclFinish)(cl_command_queue command_queue);
+
+/* Enqueued Commands APIs */
+static cl_int (*pclEnqueueReadBuffer)(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read,
+ size_t offset, size_t cb, void * ptr,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueWriteBuffer)(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write,
+ size_t offset, size_t cb, const void * ptr,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueCopyBuffer)(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer,
+ size_t src_offset, size_t dst_offset, size_t cb,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueReadImage)(cl_command_queue command_queue, cl_mem image, cl_bool blocking_read,
+ const size_t * origin, const size_t * region,
+ SIZE_T row_pitch, SIZE_T slice_pitch, void * ptr,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueWriteImage)(cl_command_queue command_queue, cl_mem image, cl_bool blocking_write,
+ const size_t * origin, const size_t * region,
+ size_t input_row_pitch, size_t input_slice_pitch, const void * ptr,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueCopyImage)(cl_command_queue command_queue, cl_mem src_image, cl_mem dst_image,
+ size_t * src_origin, size_t * dst_origin, size_t * region,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueCopyImageToBuffer)(cl_command_queue command_queue, cl_mem src_image, cl_mem dst_buffer,
+ size_t * src_origin, size_t * region, size_t dst_offset,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueCopyBufferToImage)(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_image,
+ size_t src_offset, size_t * dst_origin, size_t * region,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event);
+static void * (*pclEnqueueMapBuffer)(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map,
+ cl_map_flags map_flags, size_t offset, size_t cb,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event, cl_int * errcode_ret);
+static void * (*pclEnqueueMapImage)(cl_command_queue command_queue, cl_mem image, cl_bool blocking_map,
+ cl_map_flags map_flags, size_t * origin, size_t * region,
+ size_t * image_row_pitch, size_t * image_slice_pitch,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event, cl_int * errcode_ret);
+static cl_int (*pclEnqueueUnmapMemObject)(cl_command_queue command_queue, cl_mem memobj, void * mapped_ptr,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueNDRangeKernel)(cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim,
+ size_t * global_work_offset, size_t * global_work_size, size_t * local_work_size,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueTask)(cl_command_queue command_queue, cl_kernel kernel,
+ cl_uint num_events_in_wait_list, cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueNativeKernel)(cl_command_queue command_queue,
+ void WINAPI (*user_func)(void *args),
+ void * args, size_t cb_args,
+ cl_uint num_mem_objects, const cl_mem * mem_list, const void ** args_mem_loc,
+ cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event);
+static cl_int (*pclEnqueueMarker)(cl_command_queue command_queue, cl_event * event);
+static cl_int (*pclEnqueueWaitForEvents)(cl_command_queue command_queue, cl_uint num_events, cl_event * event_list);
+static cl_int (*pclEnqueueBarrier)(cl_command_queue command_queue);
+
+/* Extension function access */
+static void * (*pclGetExtensionFunctionAddress)(const char * func_name);
+
+
+static BOOL init_opencl(void);
+static BOOL load_opencl_func(void);
+
+static void * opencl_handle = NULL;
+
+
+/***********************************************************************
+ * DllMain [Internal]
+ *
+ * Initializes the internal 'opencl.dll'.
+ */
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID reserved)
+{
+ TRACE("opencl.dll: %p,%x,%p\n", hinstDLL, reason, reserved);
+
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hinstDLL);
+ if (init_opencl())
+ load_opencl_func();
+ break;
+
+ case DLL_PROCESS_DETACH:
+ if (reserved) break;
+ if (opencl_handle) wine_dlclose(opencl_handle, NULL, 0);
+ }
+
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * init_opencl [Internal]
+ *
+ * Initializes OpenCL library.
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+static BOOL init_opencl(void)
+{
+#ifdef SONAME_LIBOPENCL
+ char error[256];
+
+ opencl_handle = wine_dlopen(SONAME_LIBOPENCL, RTLD_NOW, error, sizeof(error));
+ if (opencl_handle != NULL)
+ {
+ TRACE("Opened library %s\n", SONAME_LIBOPENCL);
+ return TRUE;
+ }
+ else
+ ERR("Failed to open library %s: %s\n", SONAME_LIBOPENCL, error);
+#else
+ ERR("OpenCL is needed but support was not included at build time\n");
+#endif
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * load_opencl_func [Internal]
+ *
+ * Populate function table.
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+static BOOL load_opencl_func(void)
+{
+ char error[256];
+
+ if (opencl_handle == NULL)
+ return FALSE;
+
+#define LOAD_FUNCPTR(f) \
+ if (!(p##f = wine_dlsym(opencl_handle, #f, error, sizeof(error)))) \
+ WARN("%s not found in %s (%s)\n", #f, SONAME_LIBOPENCL, error);
+
+ /* Platform API */
+ LOAD_FUNCPTR(clGetPlatformIDs);
+ LOAD_FUNCPTR(clGetPlatformInfo);
+ /* Device APIs */
+ LOAD_FUNCPTR(clGetDeviceIDs);
+ LOAD_FUNCPTR(clGetDeviceInfo);
+ /* Context APIs */
+ LOAD_FUNCPTR(clCreateContext);
+ LOAD_FUNCPTR(clCreateContextFromType);
+ LOAD_FUNCPTR(clRetainContext);
+ LOAD_FUNCPTR(clReleaseContext);
+ LOAD_FUNCPTR(clGetContextInfo);
+ /* Command Queue APIs */
+ LOAD_FUNCPTR(clCreateCommandQueue);
+ LOAD_FUNCPTR(clRetainCommandQueue);
+ LOAD_FUNCPTR(clReleaseCommandQueue);
+ LOAD_FUNCPTR(clGetCommandQueueInfo);
+ LOAD_FUNCPTR(clSetCommandQueueProperty);
+ /* Memory Object APIs */
+ LOAD_FUNCPTR(clCreateBuffer);
+ LOAD_FUNCPTR(clCreateImage2D);
+ LOAD_FUNCPTR(clCreateImage3D);
+ LOAD_FUNCPTR(clRetainMemObject);
+ LOAD_FUNCPTR(clReleaseMemObject);
+ LOAD_FUNCPTR(clGetSupportedImageFormats);
+ LOAD_FUNCPTR(clGetMemObjectInfo);
+ LOAD_FUNCPTR(clGetImageInfo);
+ /* Sampler APIs */
+ LOAD_FUNCPTR(clCreateSampler);
+ LOAD_FUNCPTR(clRetainSampler);
+ LOAD_FUNCPTR(clReleaseSampler);
+ LOAD_FUNCPTR(clGetSamplerInfo);
+ /* Program Object APIs */
+ LOAD_FUNCPTR(clCreateProgramWithSource);
+ LOAD_FUNCPTR(clCreateProgramWithBinary);
+ LOAD_FUNCPTR(clRetainProgram);
+ LOAD_FUNCPTR(clReleaseProgram);
+ LOAD_FUNCPTR(clBuildProgram);
+ LOAD_FUNCPTR(clUnloadCompiler);
+ LOAD_FUNCPTR(clGetProgramInfo);
+ LOAD_FUNCPTR(clGetProgramBuildInfo);
+ /* Kernel Object APIs */
+ LOAD_FUNCPTR(clCreateKernel);
+ LOAD_FUNCPTR(clCreateKernelsInProgram);
+ LOAD_FUNCPTR(clRetainKernel);
+ LOAD_FUNCPTR(clReleaseKernel);
+ LOAD_FUNCPTR(clSetKernelArg);
+ LOAD_FUNCPTR(clGetKernelInfo);
+ LOAD_FUNCPTR(clGetKernelWorkGroupInfo);
+ /* Event Object APIs */
+ LOAD_FUNCPTR(clWaitForEvents);
+ LOAD_FUNCPTR(clGetEventInfo);
+ LOAD_FUNCPTR(clRetainEvent);
+ LOAD_FUNCPTR(clReleaseEvent);
+ /* Profiling APIs */
+ LOAD_FUNCPTR(clGetEventProfilingInfo);
+ /* Flush and Finish APIs */
+ LOAD_FUNCPTR(clFlush);
+ LOAD_FUNCPTR(clFinish);
+ /* Enqueued Commands APIs */
+ LOAD_FUNCPTR(clEnqueueReadBuffer);
+ LOAD_FUNCPTR(clEnqueueWriteBuffer);
+ LOAD_FUNCPTR(clEnqueueCopyBuffer);
+ LOAD_FUNCPTR(clEnqueueReadImage);
+ LOAD_FUNCPTR(clEnqueueWriteImage);
+ LOAD_FUNCPTR(clEnqueueCopyImage);
+ LOAD_FUNCPTR(clEnqueueCopyImageToBuffer);
+ LOAD_FUNCPTR(clEnqueueCopyBufferToImage);
+ LOAD_FUNCPTR(clEnqueueMapBuffer);
+ LOAD_FUNCPTR(clEnqueueMapImage);
+ LOAD_FUNCPTR(clEnqueueUnmapMemObject);
+ LOAD_FUNCPTR(clEnqueueNDRangeKernel);
+ LOAD_FUNCPTR(clEnqueueTask);
+ LOAD_FUNCPTR(clEnqueueNativeKernel);
+ LOAD_FUNCPTR(clEnqueueMarker);
+ LOAD_FUNCPTR(clEnqueueWaitForEvents);
+ LOAD_FUNCPTR(clEnqueueBarrier);
+ /* Extension function access */
+ LOAD_FUNCPTR(clGetExtensionFunctionAddress);
+
+#undef LOAD_FUNCPTR
+
+ return TRUE;
+}
+
+
/*---------------------------------------------------------------*/
/* Platform API */
diff --git a/include/config.h.in b/include/config.h.in
index 999f4a6130..a08e81c86e 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -1548,6 +1548,9 @@
/* Define to the soname of the libopenal library. */
#undef SONAME_LIBOPENAL
+/* Define to the soname of the libOpenCL library. */
+#undef SONAME_LIBOPENCL
+
/* Define to the soname of the libOSMesa library. */
#undef SONAME_LIBOSMESA
--
2.17.1
1
0
[PATCH v2 1/6] quartz/tests: Add some tests for AVI decompressor pin interfaces.
by Zebediah Figura 08 Mar '19
by Zebediah Figura 08 Mar '19
08 Mar '19
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/tests/avidec.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c
index 05065446f1..330d292f0f 100644
--- a/dlls/quartz/tests/avidec.c
+++ b/dlls/quartz/tests/avidec.c
@@ -61,6 +61,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO
static void test_interfaces(void)
{
IBaseFilter *filter = create_avi_dec();
+ IPin *pin;
check_interface(filter, &IID_IBaseFilter, TRUE);
check_interface(filter, &IID_IMediaFilter, TRUE);
@@ -80,6 +81,30 @@ static void test_interfaces(void)
check_interface(filter, &IID_IReferenceClock, FALSE);
check_interface(filter, &IID_IVideoWindow, FALSE);
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ check_interface(pin, &IID_IMemInputPin, TRUE);
+ check_interface(pin, &IID_IPin, TRUE);
+ todo_wine check_interface(pin, &IID_IQualityControl, TRUE);
+ check_interface(pin, &IID_IUnknown, TRUE);
+
+ check_interface(pin, &IID_IMediaPosition, FALSE);
+ todo_wine check_interface(pin, &IID_IMediaSeeking, FALSE);
+
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, source_id, &pin);
+
+ check_interface(pin, &IID_IPin, TRUE);
+ todo_wine check_interface(pin, &IID_IMediaPosition, TRUE);
+ check_interface(pin, &IID_IMediaSeeking, TRUE);
+ check_interface(pin, &IID_IQualityControl, TRUE);
+ check_interface(pin, &IID_IUnknown, TRUE);
+
+ check_interface(pin, &IID_IAsyncReader, FALSE);
+
+ IPin_Release(pin);
+
IBaseFilter_Release(filter);
}
--
2.20.1
2
6
[PATCH 1/6] quartz/tests: Add some tests for AVI decompressor pin interfaces.
by Zebediah Figura 08 Mar '19
by Zebediah Figura 08 Mar '19
08 Mar '19
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/tests/avidec.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c
index 05065446f1..330d292f0f 100644
--- a/dlls/quartz/tests/avidec.c
+++ b/dlls/quartz/tests/avidec.c
@@ -61,6 +61,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO
static void test_interfaces(void)
{
IBaseFilter *filter = create_avi_dec();
+ IPin *pin;
check_interface(filter, &IID_IBaseFilter, TRUE);
check_interface(filter, &IID_IMediaFilter, TRUE);
@@ -80,6 +81,30 @@ static void test_interfaces(void)
check_interface(filter, &IID_IReferenceClock, FALSE);
check_interface(filter, &IID_IVideoWindow, FALSE);
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ check_interface(pin, &IID_IMemInputPin, TRUE);
+ check_interface(pin, &IID_IPin, TRUE);
+ todo_wine check_interface(pin, &IID_IQualityControl, TRUE);
+ check_interface(pin, &IID_IUnknown, TRUE);
+
+ check_interface(pin, &IID_IMediaPosition, FALSE);
+ todo_wine check_interface(pin, &IID_IMediaSeeking, FALSE);
+
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, source_id, &pin);
+
+ check_interface(pin, &IID_IPin, TRUE);
+ todo_wine check_interface(pin, &IID_IMediaPosition, TRUE);
+ check_interface(pin, &IID_IMediaSeeking, TRUE);
+ check_interface(pin, &IID_IQualityControl, TRUE);
+ check_interface(pin, &IID_IUnknown, TRUE);
+
+ check_interface(pin, &IID_IAsyncReader, FALSE);
+
+ IPin_Release(pin);
+
IBaseFilter_Release(filter);
}
--
2.20.1
2
10
[PATCH v4 4/5] mfplat: Implement IMFattributes::{SetUINT32,SetUINT64,GetUINT32,GetUINT64}.
by Jactry Zeng 08 Mar '19
by Jactry Zeng 08 Mar '19
08 Mar '19
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
dlls/mfplat/Makefile.in | 2 +-
dlls/mfplat/main.c | 60 +++++++++++++++++++++++++++++++++-----
dlls/mfplat/tests/mfplat.c | 28 ++++++++++++++++--
3 files changed, 79 insertions(+), 11 deletions(-)
diff --git a/dlls/mfplat/Makefile.in b/dlls/mfplat/Makefile.in
index a117ede271..4ec51e300e 100644
--- a/dlls/mfplat/Makefile.in
+++ b/dlls/mfplat/Makefile.in
@@ -1,6 +1,6 @@
MODULE = mfplat.dll
IMPORTLIB = mfplat
-IMPORTS = advapi32 ole32
+IMPORTS = advapi32 ole32 propsys
C_SRCS = \
buffer.c \
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 5ae3b4ff07..1749bd6929 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -33,6 +33,7 @@
#include "wine/list.h"
#include "mfplat_private.h"
+#include "propvarutil.h"
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
@@ -649,22 +650,59 @@ static HRESULT WINAPI mfattributes_Compare(IMFAttributes *iface, IMFAttributes *
return E_NOTIMPL;
}
+static HRESULT mfattributes_get_item(mfattributes *object, REFGUID key, PROPVARIANT *value)
+{
+ HRESULT hr;
+ struct mfattribute *attribute = NULL;
+
+ EnterCriticalSection(&object->lock);
+
+ attribute = mfattributes_find_item(object, key, NULL);
+ if (!attribute)
+ hr = MF_E_ATTRIBUTENOTFOUND;
+ else
+ {
+ if (attribute->value.vt != value->vt)
+ hr = MF_E_INVALIDTYPE;
+ else
+ hr = PropVariantCopy(value, &attribute->value);
+ }
+
+ LeaveCriticalSection(&object->lock);
+
+ return hr;
+}
+
static HRESULT WINAPI mfattributes_GetUINT32(IMFAttributes *iface, REFGUID key, UINT32 *value)
{
mfattributes *This = impl_from_IMFAttributes(iface);
+ PROPVARIANT attrval;
+ HRESULT hr;
- FIXME("%p, %s, %p\n", This, debugstr_guid(key), value);
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(key), value);
- return E_NOTIMPL;
+ PropVariantInit(&attrval);
+ attrval.vt = VT_UI4;
+ hr = mfattributes_get_item(This, key, &attrval);
+ if (SUCCEEDED(hr))
+ hr = PropVariantToUInt32(&attrval, value);
+ return hr;
}
static HRESULT WINAPI mfattributes_GetUINT64(IMFAttributes *iface, REFGUID key, UINT64 *value)
{
mfattributes *This = impl_from_IMFAttributes(iface);
+ PROPVARIANT attrval;
+ HRESULT hr;
- FIXME("%p, %s, %p\n", This, debugstr_guid(key), value);
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(key), value);
- return E_NOTIMPL;
+ PropVariantInit(&attrval);
+ attrval.vt = VT_UI8;
+ hr = mfattributes_get_item(This, key, &attrval);
+ if (SUCCEEDED(hr))
+ hr = PropVariantToUInt64(&attrval, value);
+ return hr;
}
static HRESULT WINAPI mfattributes_GetDouble(IMFAttributes *iface, REFGUID key, double *value)
@@ -855,19 +893,25 @@ static HRESULT WINAPI mfattributes_DeleteAllItems(IMFAttributes *iface)
static HRESULT WINAPI mfattributes_SetUINT32(IMFAttributes *iface, REFGUID key, UINT32 value)
{
mfattributes *This = impl_from_IMFAttributes(iface);
+ PROPVARIANT attrval;
- FIXME("%p, %s, %d\n", This, debugstr_guid(key), value);
+ TRACE("(%p, %s, %d)\n", This, debugstr_guid(key), value);
- return E_NOTIMPL;
+ attrval.vt = VT_UI4;
+ attrval.ulVal = value;
+ return mfattributes_set_item(This, key, &attrval);
}
static HRESULT WINAPI mfattributes_SetUINT64(IMFAttributes *iface, REFGUID key, UINT64 value)
{
mfattributes *This = impl_from_IMFAttributes(iface);
+ PROPVARIANT attrval;
- FIXME("%p, %s, %s\n", This, debugstr_guid(key), wine_dbgstr_longlong(value));
+ TRACE("(%p, %s, %s)\n", This, debugstr_guid(key), wine_dbgstr_longlong(value));
- return E_NOTIMPL;
+ attrval.vt = VT_UI8;
+ attrval.uhVal.QuadPart = value;
+ return mfattributes_set_item(This, key, &attrval);
}
static HRESULT WINAPI mfattributes_SetDouble(IMFAttributes *iface, REFGUID key, double value)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index ea70b4bf5f..55c9f516c3 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -423,6 +423,8 @@ static void test_MFCreateAttributes(void)
UINT32 count;
PROPVARIANT propvar, ret_propvar;
GUID key;
+ UINT32 uint32_value;
+ UINT64 uint64_value;
hr = MFCreateAttributes( &attributes, 3 );
ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -432,13 +434,35 @@ static void test_MFCreateAttributes(void)
todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
ok(count == 0, "got %d\n", count);
- hr = IMFAttributes_SetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 0);
- todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IMFAttributes_SetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 123);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IMFAttributes_GetCount(attributes, &count);
todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
todo_wine ok(count == 1, "got %d\n", count);
+ uint32_value = 0xdeadbeef;
+ hr = IMFAttributes_GetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &uint32_value);
+ ok(hr == S_OK, "IMFAttributes_GetUINT32 failed: 0x%08x.\n", hr);
+ ok(uint32_value == 123, "got wrong value: %d, expected: 123.\n", uint32_value);
+
+ uint64_value = 0xdeadbeef;
+ hr = IMFAttributes_GetUINT64(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &uint64_value);
+ ok(hr == MF_E_INVALIDTYPE, "IMFAttributes_GetUINT64 should fail: 0x%08x.\n", hr);
+ ok(uint64_value == 0xdeadbeef, "got wrong value: %lld, expected: 0xdeadbeef.\n", uint64_value);
+
+ hr = IMFAttributes_SetUINT64(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 65536);
+ ok(hr == S_OK, "IMFAttributes_SetUINT64 failed: 0x%08x.\n", hr);
+
+ hr = IMFAttributes_GetUINT64(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &uint64_value);
+ ok(hr == S_OK, "IMFAttributes_GetUINT64 failed: 0x%08x.\n", hr);
+ ok(uint64_value == 65536, "got wrong value: %lld, expected: 65536.\n", uint64_value);
+
+ uint32_value = 0xdeadbeef;
+ hr = IMFAttributes_GetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &uint32_value);
+ ok(hr == MF_E_INVALIDTYPE, "IMFAttributes_GetUINT32 should fail: 0x%08x.\n", hr);
+ ok(uint32_value == 0xdeadbeef, "got wrong value: %d, expected: 0xdeadbeef.\n", uint32_value);
+
IMFAttributes_Release(attributes);
hr = MFCreateAttributes(&attributes, 0);
--
2.20.1
2
1
08 Mar '19
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
dlls/mfplat/buffer.c | 7 +-
dlls/mfplat/main.c | 161 +++++++++++++++++++++++++++++++---
dlls/mfplat/mediatype.c | 17 +++-
dlls/mfplat/mfplat_private.h | 13 ++-
dlls/mfplat/tests/Makefile.in | 2 +-
dlls/mfplat/tests/mfplat.c | 89 +++++++++++++++++++
6 files changed, 272 insertions(+), 17 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index 833ec041a9..afdb525dea 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -273,6 +273,7 @@ static ULONG WINAPI sample_Release(IMFSample *iface)
IMFMediaBuffer_Release(sample->buffers[i]);
DeleteCriticalSection(&sample->cs);
heap_free(sample->buffers);
+ clear_attributes_object(&sample->attributes);
heap_free(sample);
}
@@ -706,7 +707,11 @@ HRESULT WINAPI MFCreateSample(IMFSample **sample)
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
object->IMFSample_iface.lpVtbl = &samplevtbl;
InitializeCriticalSection(&object->cs);
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 6bec41884e..22803dc1b4 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -577,19 +577,48 @@ static ULONG WINAPI mfattributes_Release(IMFAttributes *iface)
if (!ref)
{
+ clear_attributes_object(This);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
}
+static struct mfattribute *mfattributes_find_item(mfattributes *object, REFGUID key, size_t *item_index)
+{
+ size_t index;
+
+ for (index = 0; index < object->count; index++)
+ {
+ if (IsEqualGUID(key, &object->attributes[index].key))
+ {
+ if (item_index)
+ *item_index = index;
+ return &object->attributes[index];
+ }
+ }
+ return NULL;
+}
+
static HRESULT WINAPI mfattributes_GetItem(IMFAttributes *iface, REFGUID key, PROPVARIANT *value)
{
mfattributes *This = impl_from_IMFAttributes(iface);
+ HRESULT hr;
+ struct mfattribute *attribute = NULL;
- FIXME("%p, %s, %p\n", This, debugstr_guid(key), value);
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(key), value);
- return E_NOTIMPL;
+ EnterCriticalSection(&This->lock);
+
+ attribute = mfattributes_find_item(This, key, NULL);
+ if (!attribute)
+ hr = MF_E_ATTRIBUTENOTFOUND;
+ else
+ hr = PropVariantCopy(value, &attribute->value);
+
+ LeaveCriticalSection(&This->lock);
+
+ return hr;
}
static HRESULT WINAPI mfattributes_GetItemType(IMFAttributes *iface, REFGUID key, MF_ATTRIBUTE_TYPE *type)
@@ -722,13 +751,68 @@ static HRESULT WINAPI mfattributes_GetUnknown(IMFAttributes *iface, REFGUID key,
return E_NOTIMPL;
}
-static HRESULT WINAPI mfattributes_SetItem(IMFAttributes *iface, REFGUID key, REFPROPVARIANT Value)
+static HRESULT mfattributes_set_item(mfattributes *object, REFGUID key, REFPROPVARIANT value)
+{
+ struct mfattribute *attribute = NULL;
+
+ EnterCriticalSection(&object->lock);
+
+ attribute = mfattributes_find_item(object, key, NULL);
+ if (!attribute)
+ {
+ if (!mf_array_reserve((void **)&object->attributes, &object->capacity, object->count + 1,
+ sizeof(*object->attributes)))
+ {
+ LeaveCriticalSection(&object->lock);
+ return E_OUTOFMEMORY;
+ }
+ object->attributes[object->count].key = *key;
+ attribute = &object->attributes[object->count];
+ object->count++;
+ }
+ else
+ PropVariantClear(&attribute->value);
+
+ PropVariantCopy(&attribute->value, value);
+
+ LeaveCriticalSection(&object->lock);
+
+ return S_OK;
+}
+
+static BOOL is_type_valid(DWORD type)
+{
+ switch (type)
+ {
+ case MF_ATTRIBUTE_UINT32:
+ case MF_ATTRIBUTE_UINT64:
+ case MF_ATTRIBUTE_DOUBLE:
+ case MF_ATTRIBUTE_GUID:
+ case MF_ATTRIBUTE_STRING:
+ case MF_ATTRIBUTE_BLOB:
+ case MF_ATTRIBUTE_IUNKNOWN:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+static HRESULT WINAPI mfattributes_SetItem(IMFAttributes *iface, REFGUID key, REFPROPVARIANT value)
{
mfattributes *This = impl_from_IMFAttributes(iface);
- FIXME("%p, %s, %p\n", This, debugstr_guid(key), Value);
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(key), value);
- return E_NOTIMPL;
+ if (!is_type_valid(value->vt))
+ {
+ PROPVARIANT empty_value;
+
+ PropVariantClear(&empty_value);
+ mfattributes_set_item(This, key, &empty_value);
+ return MF_E_INVALIDTYPE;
+ }
+ else
+ return mfattributes_set_item(This, key, value);
}
static HRESULT WINAPI mfattributes_DeleteItem(IMFAttributes *iface, REFGUID key)
@@ -897,10 +981,42 @@ static const IMFAttributesVtbl mfattributes_vtbl =
mfattributes_CopyAllItems
};
-void init_attribute_object(mfattributes *object, UINT32 size)
+HRESULT init_attributes_object(mfattributes *object, UINT32 size)
{
object->ref = 1;
object->IMFAttributes_iface.lpVtbl = &mfattributes_vtbl;
+ InitializeCriticalSection(&object->lock);
+ object->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IMFAttributes.lock");
+
+ object->attributes = NULL;
+ object->count = 0;
+ object->capacity = 0;
+ if (!mf_array_reserve((void **)&object->attributes, &object->capacity, size,
+ sizeof(*object->attributes)))
+ {
+ object->lock.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&object->lock);
+ return E_OUTOFMEMORY;
+ }
+
+ return S_OK;
+}
+
+void clear_attributes_object(mfattributes *object)
+{
+ size_t i;
+
+ EnterCriticalSection(&object->lock);
+
+ for (i = 0; i < object->count; i++)
+ PropVariantClear(&object->attributes[i].value);
+
+ heap_free(object->attributes);
+
+ LeaveCriticalSection(&object->lock);
+
+ object->lock.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&object->lock);
}
/***********************************************************************
@@ -916,7 +1032,11 @@ HRESULT WINAPI MFCreateAttributes(IMFAttributes **attributes, UINT32 size)
if(!object)
return E_OUTOFMEMORY;
- init_attribute_object(object, size);
+ if (FAILED(init_attributes_object(object, size)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
*attributes = &object->IMFAttributes_iface;
return S_OK;
@@ -978,6 +1098,7 @@ static ULONG WINAPI mfbytestream_Release(IMFByteStream *iface)
if (!ref)
{
+ clear_attributes_object(&This->attributes);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -1218,7 +1339,11 @@ HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **byt
if(!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
object->IMFByteStream_iface.lpVtbl = &mfbytestream_vtbl;
object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl;
@@ -1289,7 +1414,11 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
if(!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
object->IMFByteStream_iface.lpVtbl = &mfbytestream_vtbl;
object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl;
@@ -1445,6 +1574,7 @@ static ULONG WINAPI mfpresentationdescriptor_Release(IMFPresentationDescriptor *
if (!ref)
{
+ clear_attributes_object(&This->attributes);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -1843,7 +1973,11 @@ static HRESULT WINAPI mfsource_CreatePresentationDescriptor(IMFMediaSource *ifac
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
object->IMFPresentationDescriptor_iface.lpVtbl = &mfpresentationdescriptor_vtbl;
*descriptor = &object->IMFPresentationDescriptor_iface;
@@ -2146,6 +2280,7 @@ static ULONG WINAPI mfmediaevent_Release(IMFMediaEvent *iface)
if (!ref)
{
+ clear_attributes_object(&This->attributes);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -2436,7 +2571,11 @@ HRESULT WINAPI MFCreateMediaEvent(MediaEventType type, REFGUID extended_type, HR
if(!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
object->IMFMediaEvent_iface.lpVtbl = &mfmediaevent_vtbl;
object->type = type;
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c
index 7abbf31796..88e34e23e2 100644
--- a/dlls/mfplat/mediatype.c
+++ b/dlls/mfplat/mediatype.c
@@ -116,6 +116,7 @@ static ULONG WINAPI mediatype_Release(IMFMediaType *iface)
if (!refcount)
{
+ clear_attributes_object(&media_type->attributes);
heap_free(media_type);
}
@@ -400,7 +401,11 @@ HRESULT WINAPI MFCreateMediaType(IMFMediaType **media_type)
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
object->IMFMediaType_iface.lpVtbl = &mediatypevtbl;
*media_type = &object->IMFMediaType_iface;
@@ -456,6 +461,7 @@ static ULONG WINAPI stream_descriptor_Release(IMFStreamDescriptor *iface)
if (stream_desc->current_type)
IMFMediaType_Release(stream_desc->current_type);
DeleteCriticalSection(&stream_desc->cs);
+ clear_attributes_object(&stream_desc->attributes);
heap_free(stream_desc);
}
@@ -855,7 +861,11 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count,
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return E_OUTOFMEMORY;
+ }
object->IMFStreamDescriptor_iface.lpVtbl = &streamdescriptorvtbl;
object->IMFMediaTypeHandler_iface.lpVtbl = &mediatypehandlervtbl;
object->identifier = identifier;
@@ -1264,7 +1274,8 @@ static const IMFPresentationDescriptorVtbl presentationdescriptorvtbl =
static HRESULT presentation_descriptor_init(struct presentation_desc *object, DWORD count)
{
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(init_attributes_object(&object->attributes, 0)))
+ return E_OUTOFMEMORY;
object->IMFPresentationDescriptor_iface.lpVtbl = &presentationdescriptorvtbl;
object->descriptors = heap_alloc_zero(count * sizeof(*object->descriptors));
if (!object->descriptors)
diff --git a/dlls/mfplat/mfplat_private.h b/dlls/mfplat/mfplat_private.h
index 72f8f684f6..4ad71e225d 100644
--- a/dlls/mfplat/mfplat_private.h
+++ b/dlls/mfplat/mfplat_private.h
@@ -22,13 +22,24 @@
#include "wine/heap.h"
+struct mfattribute
+{
+ GUID key;
+ PROPVARIANT value;
+};
+
typedef struct attributes
{
IMFAttributes IMFAttributes_iface;
LONG ref;
+ CRITICAL_SECTION lock;
+ struct mfattribute *attributes;
+ size_t capacity;
+ size_t count;
} mfattributes;
-extern void init_attribute_object(mfattributes *object, UINT32 size) DECLSPEC_HIDDEN;
+extern HRESULT init_attributes_object(mfattributes *object, UINT32 size) DECLSPEC_HIDDEN;
+extern void clear_attributes_object(mfattributes *object) DECLSPEC_HIDDEN;
extern void init_system_queues(void) DECLSPEC_HIDDEN;
extern void shutdown_system_queues(void) DECLSPEC_HIDDEN;
diff --git a/dlls/mfplat/tests/Makefile.in b/dlls/mfplat/tests/Makefile.in
index 07cf328ad2..e80a3b7cfc 100644
--- a/dlls/mfplat/tests/Makefile.in
+++ b/dlls/mfplat/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = mfplat.dll
-IMPORTS = ole32 mfplat
+IMPORTS = ole32 mfplat propsys
C_SRCS = \
mfplat.c
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 2f4db9b219..95f13725bf 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -33,6 +33,7 @@
#include "mfidl.h"
#include "mferror.h"
#include "mfreadwrite.h"
+#include "propvarutil.h"
#include "wine/test.h"
@@ -58,6 +59,7 @@ DEFINE_GUID(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 0xa634a91c, 0x822b, 0x41b9,
DEFINE_GUID(DUMMY_CLSID, 0x12345678,0x1234,0x1234,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19);
DEFINE_GUID(DUMMY_GUID1, 0x12345678,0x1234,0x1234,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21);
DEFINE_GUID(DUMMY_GUID2, 0x12345678,0x1234,0x1234,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22);
+DEFINE_GUID(DUMMY_GUID3, 0x12345678,0x1234,0x1234,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23);
static const WCHAR mp4file[] = {'t','e','s','t','.','m','p','4',0};
@@ -419,6 +421,8 @@ static void test_MFCreateAttributes(void)
IMFAttributes *attributes;
HRESULT hr;
UINT32 count;
+ PROPVARIANT propvar, ret_propvar;
+ GUID key;
hr = MFCreateAttributes( &attributes, 3 );
ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -436,6 +440,91 @@ static void test_MFCreateAttributes(void)
todo_wine ok(count == 1, "got %d\n", count);
IMFAttributes_Release(attributes);
+
+ hr = MFCreateAttributes(&attributes, 0);
+ ok(hr == S_OK, "MFCreateAttributes failed: 0x%08x.\n", hr);
+
+ PropVariantInit(&propvar);
+ propvar.vt = MF_ATTRIBUTE_UINT32;
+ U(propvar).ulVal = 123;
+ hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID1, &propvar);
+ ok(hr == S_OK, "IMFAttributes_SetItem failed: 0x%08x.\n", hr);
+ PropVariantInit(&ret_propvar);
+ ret_propvar.vt = MF_ATTRIBUTE_UINT32;
+ U(ret_propvar).ulVal = 0xdeadbeef;
+ hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, &ret_propvar);
+ ok(hr == S_OK, "IMFAttributes_GetItem failed: 0x%08x.\n", hr);
+ ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "got wrong property.\n");
+ PropVariantClear(&ret_propvar);
+
+ PropVariantInit(&ret_propvar);
+ ret_propvar.vt = MF_ATTRIBUTE_STRING;
+ U(ret_propvar).pwszVal = NULL;
+ hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, &ret_propvar);
+ ok(hr == S_OK, "IMFAttributes_GetItem failed: 0x%08x.\n", hr);
+ ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "got wrong property.\n");
+ PropVariantClear(&ret_propvar);
+
+ PropVariantClear(&propvar);
+
+ PropVariantInit(&propvar);
+ propvar.vt = MF_ATTRIBUTE_UINT64;
+ U(propvar).uhVal.QuadPart = 65536;
+ hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID1, &propvar);
+ ok(hr == S_OK, "IMFAttributes_SetItem failed: 0x%08x.\n", hr);
+ PropVariantInit(&ret_propvar);
+ ret_propvar.vt = MF_ATTRIBUTE_UINT32;
+ U(ret_propvar).ulVal = 0xdeadbeef;
+ hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, &ret_propvar);
+ ok(hr == S_OK, "IMFAttributes_GetItem failed: 0x%08x.\n", hr);
+ ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "got wrong property.\n");
+ PropVariantClear(&ret_propvar);
+ PropVariantClear(&propvar);
+
+ PropVariantInit(&propvar);
+ propvar.vt = VT_I4;
+ U(propvar).lVal = 123;
+ hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID2, &propvar);
+ ok(hr == MF_E_INVALIDTYPE, "IMFAttributes_SetItem should failed: 0x%08x.\n", hr);
+ PropVariantInit(&ret_propvar);
+ ret_propvar.vt = MF_ATTRIBUTE_UINT32;
+ U(ret_propvar).lVal = 0xdeadbeef;
+ hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID2, &ret_propvar);
+ ok(hr == S_OK, "IMFAttributes_GetItem failed: 0x%08x.\n", hr);
+ PropVariantClear(&propvar);
+ ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "got wrong property.\n");
+ PropVariantClear(&ret_propvar);
+
+ PropVariantInit(&propvar);
+ propvar.vt = MF_ATTRIBUTE_UINT32;
+ U(propvar).ulVal = 123;
+ hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID3, &propvar);
+ ok(hr == S_OK, "IMFAttributes_SetItem failed: 0x%08x.\n", hr);
+
+ hr = IMFAttributes_DeleteItem(attributes, &DUMMY_GUID2);
+ todo_wine ok(hr == S_OK, "IMFAttributes_DeleteItem failed: 0x%08x.\n", hr);
+ key = GUID_NULL;
+ if (is_win8_plus)
+ hr = IMFAttributes_GetItemByIndex(attributes, 0, &key, &ret_propvar);
+ else
+ hr = IMFAttributes_GetItemByIndex(attributes, 1, &key, &ret_propvar);
+ todo_wine ok(hr == S_OK, "IMFAttributes_GetItemByIndex failed: 0x%08x.\n", hr);
+ todo_wine ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "got wrong property.\n");
+ todo_wine ok(IsEqualIID(&key, &DUMMY_GUID3), "got wrong key: %s.\n", wine_dbgstr_guid(&key));
+ PropVariantClear(&ret_propvar);
+ PropVariantClear(&propvar);
+ propvar.vt = MF_ATTRIBUTE_UINT64;
+ U(propvar).uhVal.QuadPart = 65536;
+ key = GUID_NULL;
+ if (is_win8_plus)
+ hr = IMFAttributes_GetItemByIndex(attributes, 1, &key, &ret_propvar);
+ else
+ hr = IMFAttributes_GetItemByIndex(attributes, 0, &key, &ret_propvar);
+ todo_wine ok(hr == S_OK, "IMFAttributes_GetItemByIndex failed: 0x%08x.\n", hr);
+ todo_wine ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "got wrong property.\n");
+ todo_wine ok(IsEqualIID(&key, &DUMMY_GUID1), "got wrong key: %s.\n", wine_dbgstr_guid(&key));
+
+ IMFAttributes_Release(attributes);
}
static void test_MFCreateMFByteStreamOnStream(void)
--
2.20.1
2
1