Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
8f99494c
Commit
8f99494c
authored
Apr 12, 2013
by
highgod0401
Committed by
Michael Niedermayer
Apr 12, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avutil/opencl: merge opencl env to opencl context
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
34b78ad0
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
160 additions
and
170 deletions
+160
-170
opencl.c
libavutil/opencl.c
+160
-170
No files found.
libavutil/opencl.c
View file @
8f99494c
...
...
@@ -49,9 +49,19 @@ typedef struct {
}
KernelCode
;
typedef
struct
{
const
AVClass
*
class
;
int
log_offset
;
void
*
log_ctx
;
int
init_count
;
int
opt_init_flag
;
/**
* if set to 1, the OpenCL environment was created by the user and
* passed as AVOpenCLExternalEnv when initing ,0:created by opencl wrapper.
*/
int
is_user_created
;
int
platform_idx
;
int
device_idx
;
char
*
build_options
;
cl_platform_id
platform_id
;
cl_device_type
device_type
;
cl_context
context
;
...
...
@@ -62,25 +72,10 @@ typedef struct {
int
kernel_code_count
;
KernelCode
kernel_code
[
MAX_KERNEL_CODE_NUM
];
int
kernel_count
;
/**
* if set to 1, the OpenCL environment was created by the user and
* passed as AVOpenCLExternalEnv when initing ,0:created by opencl wrapper.
*/
int
is_user_created
;
AVOpenCLDeviceList
device_list
;
}
GPUEnv
;
}
OpenclContext
;
typedef
struct
{
const
AVClass
*
class
;
int
log_offset
;
void
*
log_ctx
;
int
init_flag
;
int
platform_idx
;
int
device_idx
;
char
*
build_options
;
}
OpenclUtils
;
#define OFFSET(x) offsetof(OpenclUtils, x)
#define OFFSET(x) offsetof(OpenclContext, x)
static
const
AVOption
opencl_options
[]
=
{
{
"platform_idx"
,
"set platform index value"
,
OFFSET
(
platform_idx
),
AV_OPT_TYPE_INT
,
{.
i64
=-
1
},
-
1
,
INT_MAX
},
...
...
@@ -93,17 +88,14 @@ static const AVClass openclutils_class = {
.
option
=
opencl_options
,
.
item_name
=
av_default_item_name
,
.
version
=
LIBAVUTIL_VERSION_INT
,
.
log_level_offset_offset
=
offsetof
(
Opencl
Utils
,
log_offset
),
.
parent_log_context_offset
=
offsetof
(
Opencl
Utils
,
log_ctx
),
.
log_level_offset_offset
=
offsetof
(
Opencl
Context
,
log_offset
),
.
parent_log_context_offset
=
offsetof
(
Opencl
Context
,
log_ctx
),
};
static
OpenclUtils
openclutils
=
{
&
openclutils_class
};
static
GPUEnv
gpu_env
;
static
OpenclContext
opencl_ctx
=
{
&
openclutils_class
};
static
const
cl_device_type
device_type
[]
=
{
CL_DEVICE_TYPE_GPU
,
CL_DEVICE_TYPE_CPU
,
CL_DEVICE_TYPE_DEFAULT
};
typedef
struct
{
int
err_code
;
const
char
*
err_str
;
...
...
@@ -208,7 +200,7 @@ static int get_device_list(AVOpenCLDeviceList *device_list)
AVOpenCLDeviceNode
*
device_node
=
NULL
;
status
=
clGetPlatformIDs
(
0
,
NULL
,
&
device_list
->
platform_num
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not get OpenCL platform ids: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
@@ -217,7 +209,7 @@ static int get_device_list(AVOpenCLDeviceList *device_list)
return
AVERROR
(
ENOMEM
);
status
=
clGetPlatformIDs
(
device_list
->
platform_num
,
platform_ids
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not get OpenCL platform ids: %s
\n
"
,
opencl_errstr
(
status
));
ret
=
AVERROR_EXTERNAL
;
goto
end
;
...
...
@@ -263,7 +255,7 @@ static int get_device_list(AVOpenCLDeviceList *device_list)
status
=
clGetDeviceIDs
(
device_list
->
platform_node
[
i
]
->
platform_id
,
device_type
[
j
],
devices_num
[
j
],
device_ids
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_WARNING
,
av_log
(
&
opencl
_ctx
,
AV_LOG_WARNING
,
"Could not get device ID: %s:
\n
"
,
opencl_errstr
(
status
));
av_freep
(
&
device_ids
);
continue
;
...
...
@@ -282,7 +274,7 @@ static int get_device_list(AVOpenCLDeviceList *device_list)
sizeof
(
device_node
->
device_name
),
device_node
->
device_name
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_WARNING
,
av_log
(
&
opencl
_ctx
,
AV_LOG_WARNING
,
"Could not get device name: %s
\n
"
,
opencl_errstr
(
status
));
continue
;
}
...
...
@@ -306,12 +298,12 @@ int av_opencl_get_device_list(AVOpenCLDeviceList **device_list)
int
ret
=
0
;
*
device_list
=
av_mallocz
(
sizeof
(
AVOpenCLDeviceList
));
if
(
!
(
*
device_list
))
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
"Could not allocate opencl device list
\n
"
);
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not allocate opencl device list
\n
"
);
return
AVERROR
(
ENOMEM
);
}
ret
=
get_device_list
(
*
device_list
);
if
(
ret
<
0
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
"Could not get device list from environment
\n
"
);
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not get device list from environment
\n
"
);
free_device_list
(
*
device_list
);
av_freep
(
device_list
);
return
ret
;
...
...
@@ -329,11 +321,11 @@ int av_opencl_set_option(const char *key, const char *val)
{
int
ret
=
0
;
LOCK_OPENCL
if
(
!
opencl
utils
.
init_flag
)
{
av_opt_set_defaults
(
&
opencl
utils
);
opencl
utils
.
init_flag
=
1
;
if
(
!
opencl
_ctx
.
opt_
init_flag
)
{
av_opt_set_defaults
(
&
opencl
_ctx
);
opencl
_ctx
.
opt_
init_flag
=
1
;
}
ret
=
av_opt_set
(
&
opencl
utils
,
key
,
val
,
0
);
ret
=
av_opt_set
(
&
opencl
_ctx
,
key
,
val
,
0
);
UNLOCK_OPENCL
return
ret
;
}
...
...
@@ -342,7 +334,7 @@ int av_opencl_get_option(const char *key, uint8_t **out_val)
{
int
ret
=
0
;
LOCK_OPENCL
ret
=
av_opt_get
(
&
opencl
utils
,
key
,
0
,
out_val
);
ret
=
av_opt_get
(
&
opencl
_ctx
,
key
,
0
,
out_val
);
UNLOCK_OPENCL
return
ret
;
}
...
...
@@ -351,7 +343,7 @@ void av_opencl_free_option(void)
{
/*FIXME: free openclutils context*/
LOCK_OPENCL
av_opt_free
(
&
opencl
utils
);
av_opt_free
(
&
opencl
_ctx
);
UNLOCK_OPENCL
}
...
...
@@ -359,7 +351,7 @@ AVOpenCLExternalEnv *av_opencl_alloc_external_env(void)
{
AVOpenCLExternalEnv
*
ext
=
av_mallocz
(
sizeof
(
AVOpenCLExternalEnv
));
if
(
!
ext
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not malloc external opencl environment data space
\n
"
);
}
return
ext
;
...
...
@@ -374,22 +366,22 @@ int av_opencl_register_kernel_code(const char *kernel_code)
{
int
i
,
ret
=
0
;
LOCK_OPENCL
;
if
(
gpu_env
.
kernel_code_count
>=
MAX_KERNEL_CODE_NUM
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
if
(
opencl_ctx
.
kernel_code_count
>=
MAX_KERNEL_CODE_NUM
)
{
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not register kernel code, maximum number of registered kernel code %d already reached
\n
"
,
MAX_KERNEL_CODE_NUM
);
ret
=
AVERROR
(
EINVAL
);
goto
end
;
}
for
(
i
=
0
;
i
<
gpu_env
.
kernel_code_count
;
i
++
)
{
if
(
gpu_env
.
kernel_code
[
i
].
kernel_string
==
kernel_code
)
{
av_log
(
&
opencl
utils
,
AV_LOG_WARNING
,
"Same kernel code has been registered
\n
"
);
for
(
i
=
0
;
i
<
opencl_ctx
.
kernel_code_count
;
i
++
)
{
if
(
opencl_ctx
.
kernel_code
[
i
].
kernel_string
==
kernel_code
)
{
av_log
(
&
opencl
_ctx
,
AV_LOG_WARNING
,
"Same kernel code has been registered
\n
"
);
goto
end
;
}
}
gpu_env
.
kernel_code
[
gpu_env
.
kernel_code_count
].
kernel_string
=
kernel_code
;
gpu_env
.
kernel_code
[
gpu_env
.
kernel_code_count
].
is_compiled
=
0
;
gpu_env
.
kernel_code_count
++
;
opencl_ctx
.
kernel_code
[
opencl_ctx
.
kernel_code_count
].
kernel_string
=
kernel_code
;
opencl_ctx
.
kernel_code
[
opencl_ctx
.
kernel_code_count
].
is_compiled
=
0
;
opencl_ctx
.
kernel_code_count
++
;
end:
UNLOCK_OPENCL
;
return
ret
;
...
...
@@ -401,35 +393,35 @@ int av_opencl_create_kernel(AVOpenCLKernelEnv *env, const char *kernel_name)
int
i
,
ret
=
0
;
LOCK_OPENCL
;
if
(
strlen
(
kernel_name
)
+
1
>
AV_OPENCL_MAX_KERNEL_NAME_SIZE
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
"Created kernel name %s is too long
\n
"
,
kernel_name
);
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Created kernel name %s is too long
\n
"
,
kernel_name
);
ret
=
AVERROR
(
EINVAL
);
goto
end
;
}
if
(
!
env
->
kernel
)
{
if
(
gpu_env
.
kernel_count
>=
MAX_KERNEL_NUM
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
if
(
opencl_ctx
.
kernel_count
>=
MAX_KERNEL_NUM
)
{
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not create kernel with name '%s', maximum number of kernels %d already reached
\n
"
,
kernel_name
,
MAX_KERNEL_NUM
);
ret
=
AVERROR
(
EINVAL
);
goto
end
;
}
if
(
gpu_env
.
program_count
==
0
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
"Program count of OpenCL is 0, can not create kernel
\n
"
);
if
(
opencl_ctx
.
program_count
==
0
)
{
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Program count of OpenCL is 0, can not create kernel
\n
"
);
ret
=
AVERROR
(
EINVAL
);
goto
end
;
}
for
(
i
=
0
;
i
<
gpu_env
.
program_count
;
i
++
)
{
env
->
kernel
=
clCreateKernel
(
gpu_env
.
programs
[
i
],
kernel_name
,
&
status
);
for
(
i
=
0
;
i
<
opencl_ctx
.
program_count
;
i
++
)
{
env
->
kernel
=
clCreateKernel
(
opencl_ctx
.
programs
[
i
],
kernel_name
,
&
status
);
if
(
status
==
CL_SUCCESS
)
break
;
}
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
"Could not create OpenCL kernel: %s
\n
"
,
opencl_errstr
(
status
));
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not create OpenCL kernel: %s
\n
"
,
opencl_errstr
(
status
));
ret
=
AVERROR_EXTERNAL
;
goto
end
;
}
gpu_env
.
kernel_count
++
;
env
->
command_queue
=
gpu_env
.
command_queue
;
opencl_ctx
.
kernel_count
++
;
env
->
command_queue
=
opencl_ctx
.
command_queue
;
av_strlcpy
(
env
->
kernel_name
,
kernel_name
,
sizeof
(
env
->
kernel_name
));
}
end:
...
...
@@ -445,18 +437,18 @@ void av_opencl_release_kernel(AVOpenCLKernelEnv *env)
goto
end
;
status
=
clReleaseKernel
(
env
->
kernel
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
"Could not release kernel: %s
\n
"
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not release kernel: %s
\n
"
,
opencl_errstr
(
status
));
}
env
->
kernel
=
NULL
;
env
->
command_queue
=
NULL
;
env
->
kernel_name
[
0
]
=
0
;
gpu_env
.
kernel_count
--
;
opencl_ctx
.
kernel_count
--
;
end:
UNLOCK_OPENCL
}
static
int
init_opencl_env
(
GPUEnv
*
gpu_env
,
AVOpenCLExternalEnv
*
ext_opencl_env
)
static
int
init_opencl_env
(
OpenclContext
*
opencl_ctx
,
AVOpenCLExternalEnv
*
ext_opencl_env
)
{
cl_int
status
;
cl_context_properties
cps
[
3
];
...
...
@@ -464,83 +456,83 @@ static int init_opencl_env(GPUEnv *gpu_env, AVOpenCLExternalEnv *ext_opencl_env)
AVOpenCLDeviceNode
*
device_node
=
NULL
;
if
(
ext_opencl_env
)
{
if
(
gpu_env
->
is_user_created
)
if
(
opencl_ctx
->
is_user_created
)
return
0
;
gpu_env
->
platform_id
=
ext_opencl_env
->
platform_id
;
gpu_env
->
is_user_created
=
1
;
gpu_env
->
command_queue
=
ext_opencl_env
->
command_queue
;
gpu_env
->
context
=
ext_opencl_env
->
context
;
gpu_env
->
device_id
=
ext_opencl_env
->
device_id
;
gpu_env
->
device_type
=
ext_opencl_env
->
device_type
;
opencl_ctx
->
platform_id
=
ext_opencl_env
->
platform_id
;
opencl_ctx
->
is_user_created
=
1
;
opencl_ctx
->
command_queue
=
ext_opencl_env
->
command_queue
;
opencl_ctx
->
context
=
ext_opencl_env
->
context
;
opencl_ctx
->
device_id
=
ext_opencl_env
->
device_id
;
opencl_ctx
->
device_type
=
ext_opencl_env
->
device_type
;
}
else
{
if
(
!
gpu_env
->
is_user_created
)
{
if
(
!
gpu_env
->
device_list
.
platform_num
)
{
ret
=
get_device_list
(
&
gpu_env
->
device_list
);
if
(
!
opencl_ctx
->
is_user_created
)
{
if
(
!
opencl_ctx
->
device_list
.
platform_num
)
{
ret
=
get_device_list
(
&
opencl_ctx
->
device_list
);
if
(
ret
<
0
)
{
return
ret
;
}
}
if
(
gpu_env
->
platform_idx
>=
0
)
{
if
(
gpu_env
->
device_list
.
platform_num
<
gpu_env
->
platform_idx
+
1
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
"User set platform index not exist
\n
"
);
if
(
opencl_ctx
->
platform_idx
>=
0
)
{
if
(
opencl_ctx
->
device_list
.
platform_num
<
opencl_ctx
->
platform_idx
+
1
)
{
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"User set platform index not exist
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
(
!
gpu_env
->
device_list
.
platform_node
[
gpu_env
->
platform_idx
]
->
device_num
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
"No devices in user specific platform with index %d
\n
"
,
gpu_env
->
platform_idx
);
if
(
!
opencl_ctx
->
device_list
.
platform_node
[
opencl_ctx
->
platform_idx
]
->
device_num
)
{
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"No devices in user specific platform with index %d
\n
"
,
opencl_ctx
->
platform_idx
);
return
AVERROR
(
EINVAL
);
}
gpu_env
->
platform_id
=
gpu_env
->
device_list
.
platform_node
[
gpu_env
->
platform_idx
]
->
platform_id
;
opencl_ctx
->
platform_id
=
opencl_ctx
->
device_list
.
platform_node
[
opencl_ctx
->
platform_idx
]
->
platform_id
;
}
else
{
/* get a usable platform by default*/
for
(
i
=
0
;
i
<
gpu_env
->
device_list
.
platform_num
;
i
++
)
{
if
(
gpu_env
->
device_list
.
platform_node
[
i
]
->
device_num
)
{
gpu_env
->
platform_id
=
gpu_env
->
device_list
.
platform_node
[
i
]
->
platform_id
;
gpu_env
->
platform_idx
=
i
;
for
(
i
=
0
;
i
<
opencl_ctx
->
device_list
.
platform_num
;
i
++
)
{
if
(
opencl_ctx
->
device_list
.
platform_node
[
i
]
->
device_num
)
{
opencl_ctx
->
platform_id
=
opencl_ctx
->
device_list
.
platform_node
[
i
]
->
platform_id
;
opencl_ctx
->
platform_idx
=
i
;
break
;
}
}
}
if
(
!
gpu_env
->
platform_id
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
"Could not get OpenCL platforms
\n
"
);
if
(
!
opencl_ctx
->
platform_id
)
{
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"Could not get OpenCL platforms
\n
"
);
return
AVERROR_EXTERNAL
;
}
/* get a usable device*/
if
(
gpu_env
->
device_idx
>=
0
)
{
if
(
gpu_env
->
device_list
.
platform_node
[
gpu_env
->
platform_idx
]
->
device_num
<
gpu_env
->
device_idx
+
1
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
"Could not get OpenCL device idx %d in the user set platform
\n
"
,
gpu_env
->
platform_idx
);
if
(
opencl_ctx
->
device_idx
>=
0
)
{
if
(
opencl_ctx
->
device_list
.
platform_node
[
opencl_ctx
->
platform_idx
]
->
device_num
<
opencl_ctx
->
device_idx
+
1
)
{
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"Could not get OpenCL device idx %d in the user set platform
\n
"
,
opencl_ctx
->
platform_idx
);
return
AVERROR
(
EINVAL
);
}
}
else
{
gpu_env
->
device_idx
=
0
;
opencl_ctx
->
device_idx
=
0
;
}
device_node
=
gpu_env
->
device_list
.
platform_node
[
gpu_env
->
platform_idx
]
->
device_node
[
gpu_env
->
device_idx
];
gpu_env
->
device_id
=
device_node
->
device_id
;
gpu_env
->
device_type
=
device_node
->
device_type
;
device_node
=
opencl_ctx
->
device_list
.
platform_node
[
opencl_ctx
->
platform_idx
]
->
device_node
[
opencl_ctx
->
device_idx
];
opencl_ctx
->
device_id
=
device_node
->
device_id
;
opencl_ctx
->
device_type
=
device_node
->
device_type
;
/*
* Use available platform.
*/
av_log
(
&
openclutils
,
AV_LOG_VERBOSE
,
"Platform Name: %s, device id: 0x%x
\n
"
,
gpu_env
->
device_list
.
platform_node
[
gpu_env
->
platform_idx
]
->
platform_name
,
(
unsigned
int
)
gpu_env
->
device_id
);
av_log
(
opencl_ctx
,
AV_LOG_VERBOSE
,
"Platform Name: %s, device id: 0x%x
\n
"
,
opencl_ctx
->
device_list
.
platform_node
[
opencl_ctx
->
platform_idx
]
->
platform_name
,
(
unsigned
int
)
opencl_ctx
->
device_id
);
cps
[
0
]
=
CL_CONTEXT_PLATFORM
;
cps
[
1
]
=
(
cl_context_properties
)
gpu_env
->
platform_id
;
cps
[
1
]
=
(
cl_context_properties
)
opencl_ctx
->
platform_id
;
cps
[
2
]
=
0
;
/* Check for GPU. */
gpu_env
->
context
=
clCreateContextFromType
(
cps
,
gpu_env
->
device_type
,
opencl_ctx
->
context
=
clCreateContextFromType
(
cps
,
opencl_ctx
->
device_type
,
NULL
,
NULL
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"Could not get OpenCL context from device type: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
gpu_env
->
command_queue
=
clCreateCommandQueue
(
gpu_env
->
context
,
gpu_env
->
device_id
,
opencl_ctx
->
command_queue
=
clCreateCommandQueue
(
opencl_ctx
->
context
,
opencl_ctx
->
device_id
,
0
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"Could not create OpenCL command queue: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
@@ -549,16 +541,16 @@ static int init_opencl_env(GPUEnv *gpu_env, AVOpenCLExternalEnv *ext_opencl_env)
return
ret
;
}
static
int
compile_kernel_file
(
GPUEnv
*
gpu_env
,
const
char
*
build_options
)
static
int
compile_kernel_file
(
OpenclContext
*
opencl_ctx
)
{
cl_int
status
;
char
*
temp
,
*
source_str
=
NULL
;
size_t
source_str_len
=
0
;
int
i
,
ret
=
0
;
for
(
i
=
0
;
i
<
gpu_env
->
kernel_code_count
;
i
++
)
{
if
(
!
gpu_env
->
kernel_code
[
i
].
is_compiled
)
source_str_len
+=
strlen
(
gpu_env
->
kernel_code
[
i
].
kernel_string
);
for
(
i
=
0
;
i
<
opencl_ctx
->
kernel_code_count
;
i
++
)
{
if
(
!
opencl_ctx
->
kernel_code
[
i
].
is_compiled
)
source_str_len
+=
strlen
(
opencl_ctx
->
kernel_code
[
i
].
kernel_string
);
}
if
(
!
source_str_len
)
{
return
0
;
...
...
@@ -568,38 +560,38 @@ static int compile_kernel_file(GPUEnv *gpu_env, const char *build_options)
return
AVERROR
(
ENOMEM
);
}
temp
=
source_str
;
for
(
i
=
0
;
i
<
gpu_env
->
kernel_code_count
;
i
++
)
{
if
(
!
gpu_env
->
kernel_code
[
i
].
is_compiled
)
{
memcpy
(
temp
,
gpu_env
->
kernel_code
[
i
].
kernel_string
,
strlen
(
gpu_env
->
kernel_code
[
i
].
kernel_string
));
gpu_env
->
kernel_code
[
i
].
is_compiled
=
1
;
temp
+=
strlen
(
gpu_env
->
kernel_code
[
i
].
kernel_string
);
for
(
i
=
0
;
i
<
opencl_ctx
->
kernel_code_count
;
i
++
)
{
if
(
!
opencl_ctx
->
kernel_code
[
i
].
is_compiled
)
{
memcpy
(
temp
,
opencl_ctx
->
kernel_code
[
i
].
kernel_string
,
strlen
(
opencl_ctx
->
kernel_code
[
i
].
kernel_string
));
opencl_ctx
->
kernel_code
[
i
].
is_compiled
=
1
;
temp
+=
strlen
(
opencl_ctx
->
kernel_code
[
i
].
kernel_string
);
}
}
/* create a CL program using the kernel source */
gpu_env
->
programs
[
gpu_env
->
program_count
]
=
clCreateProgramWithSource
(
gpu_env
->
context
,
opencl_ctx
->
programs
[
opencl_ctx
->
program_count
]
=
clCreateProgramWithSource
(
opencl_ctx
->
context
,
1
,
(
const
char
**
)(
&
source_str
),
&
source_str_len
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"Could not create OpenCL program with source code: %s
\n
"
,
opencl_errstr
(
status
));
ret
=
AVERROR_EXTERNAL
;
goto
end
;
}
if
(
!
gpu_env
->
programs
[
gpu_env
->
program_count
])
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
"Created program is NULL
\n
"
);
if
(
!
opencl_ctx
->
programs
[
opencl_ctx
->
program_count
])
{
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"Created program is NULL
\n
"
);
ret
=
AVERROR_EXTERNAL
;
goto
end
;
}
status
=
clBuildProgram
(
gpu_env
->
programs
[
gpu_env
->
program_count
],
1
,
&
(
gpu_env
->
device_id
),
build_options
,
NULL
,
NULL
);
status
=
clBuildProgram
(
opencl_ctx
->
programs
[
opencl_ctx
->
program_count
],
1
,
&
(
opencl_ctx
->
device_id
),
opencl_ctx
->
build_options
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
openclutils
,
AV_LOG_ERROR
,
av_log
(
opencl_ctx
,
AV_LOG_ERROR
,
"Could not compile OpenCL kernel: %s
\n
"
,
opencl_errstr
(
status
));
ret
=
AVERROR_EXTERNAL
;
goto
end
;
}
gpu_env
->
program_count
++
;
opencl_ctx
->
program_count
++
;
end:
av_free
(
source_str
);
return
ret
;
...
...
@@ -609,27 +601,25 @@ int av_opencl_init(AVOpenCLExternalEnv *ext_opencl_env)
{
int
ret
=
0
;
LOCK_OPENCL
if
(
!
gpu_env
.
init_count
)
{
if
(
!
openclutils
.
init_flag
)
{
av_opt_set_defaults
(
&
openclutils
);
openclutils
.
init_flag
=
1
;
}
gpu_env
.
device_idx
=
openclutils
.
device_idx
;
gpu_env
.
platform_idx
=
openclutils
.
platform_idx
;
ret
=
init_opencl_env
(
&
gpu_env
,
ext_opencl_env
);
if
(
!
opencl_ctx
.
init_count
)
{
if
(
!
opencl_ctx
.
opt_init_flag
)
{
av_opt_set_defaults
(
&
opencl_ctx
);
opencl_ctx
.
opt_init_flag
=
1
;
}
ret
=
init_opencl_env
(
&
opencl_ctx
,
ext_opencl_env
);
if
(
ret
<
0
)
goto
end
;
}
ret
=
compile_kernel_file
(
&
gpu_env
,
openclutils
.
build_options
);
ret
=
compile_kernel_file
(
&
opencl_ctx
);
if
(
ret
<
0
)
goto
end
;
if
(
gpu_env
.
kernel_code_count
<=
0
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
if
(
opencl_ctx
.
kernel_code_count
<=
0
)
{
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"No kernel code is registered, compile kernel file failed
\n
"
);
ret
=
AVERROR
(
EINVAL
);
goto
end
;
}
gpu_env
.
init_count
++
;
opencl_ctx
.
init_count
++
;
end:
UNLOCK_OPENCL
...
...
@@ -641,50 +631,50 @@ void av_opencl_uninit(void)
cl_int
status
;
int
i
;
LOCK_OPENCL
gpu_env
.
init_count
--
;
if
(
gpu_env
.
is_user_created
)
opencl_ctx
.
init_count
--
;
if
(
opencl_ctx
.
is_user_created
)
goto
end
;
if
(
gpu_env
.
init_count
>
0
||
gpu_env
.
kernel_count
>
0
)
if
(
opencl_ctx
.
init_count
>
0
||
opencl_ctx
.
kernel_count
>
0
)
goto
end
;
for
(
i
=
0
;
i
<
gpu_env
.
program_count
;
i
++
)
{
if
(
gpu_env
.
programs
[
i
])
{
status
=
clReleaseProgram
(
gpu_env
.
programs
[
i
]);
for
(
i
=
0
;
i
<
opencl_ctx
.
program_count
;
i
++
)
{
if
(
opencl_ctx
.
programs
[
i
])
{
status
=
clReleaseProgram
(
opencl_ctx
.
programs
[
i
]);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not release OpenCL program: %s
\n
"
,
opencl_errstr
(
status
));
}
gpu_env
.
programs
[
i
]
=
NULL
;
opencl_ctx
.
programs
[
i
]
=
NULL
;
}
}
if
(
gpu_env
.
command_queue
)
{
status
=
clReleaseCommandQueue
(
gpu_env
.
command_queue
);
if
(
opencl_ctx
.
command_queue
)
{
status
=
clReleaseCommandQueue
(
opencl_ctx
.
command_queue
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not release OpenCL command queue: %s
\n
"
,
opencl_errstr
(
status
));
}
gpu_env
.
command_queue
=
NULL
;
opencl_ctx
.
command_queue
=
NULL
;
}
if
(
gpu_env
.
context
)
{
status
=
clReleaseContext
(
gpu_env
.
context
);
if
(
opencl_ctx
.
context
)
{
status
=
clReleaseContext
(
opencl_ctx
.
context
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not release OpenCL context: %s
\n
"
,
opencl_errstr
(
status
));
}
gpu_env
.
context
=
NULL
;
opencl_ctx
.
context
=
NULL
;
}
free_device_list
(
&
gpu_env
.
device_list
);
free_device_list
(
&
opencl_ctx
.
device_list
);
end:
if
((
gpu_env
.
init_count
<=
0
)
&&
(
gpu_env
.
kernel_count
<=
0
))
av_opt_free
(
&
opencl
utils
);
//FIXME: free openclutils context
if
((
opencl_ctx
.
init_count
<=
0
)
&&
(
opencl_ctx
.
kernel_count
<=
0
))
av_opt_free
(
&
opencl
_ctx
);
//FIXME: free openclutils context
UNLOCK_OPENCL
}
int
av_opencl_buffer_create
(
cl_mem
*
cl_buf
,
size_t
cl_buf_size
,
int
flags
,
void
*
host_ptr
)
{
cl_int
status
;
*
cl_buf
=
clCreateBuffer
(
gpu_env
.
context
,
flags
,
cl_buf_size
,
host_ptr
,
&
status
);
*
cl_buf
=
clCreateBuffer
(
opencl_ctx
.
context
,
flags
,
cl_buf_size
,
host_ptr
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
"Could not create OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not create OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
return
0
;
...
...
@@ -697,7 +687,7 @@ void av_opencl_buffer_release(cl_mem *cl_buf)
return
;
status
=
clReleaseMemObject
(
*
cl_buf
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not release OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
}
memset
(
cl_buf
,
0
,
sizeof
(
*
cl_buf
));
...
...
@@ -706,20 +696,20 @@ void av_opencl_buffer_release(cl_mem *cl_buf)
int
av_opencl_buffer_write
(
cl_mem
dst_cl_buf
,
uint8_t
*
src_buf
,
size_t
buf_size
)
{
cl_int
status
;
void
*
mapped
=
clEnqueueMapBuffer
(
gpu_env
.
command_queue
,
dst_cl_buf
,
CL_TRUE
,
CL_MAP_WRITE
,
0
,
sizeof
(
uint8_t
)
*
buf_size
,
void
*
mapped
=
clEnqueueMapBuffer
(
opencl_ctx
.
command_queue
,
dst_cl_buf
,
CL_TRUE
,
CL_MAP_WRITE
,
0
,
sizeof
(
uint8_t
)
*
buf_size
,
0
,
NULL
,
NULL
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not map OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
memcpy
(
mapped
,
src_buf
,
buf_size
);
status
=
clEnqueueUnmapMemObject
(
gpu_env
.
command_queue
,
dst_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
status
=
clEnqueueUnmapMemObject
(
opencl_ctx
.
command_queue
,
dst_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not unmap OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
@@ -729,20 +719,20 @@ int av_opencl_buffer_write(cl_mem dst_cl_buf, uint8_t *src_buf, size_t buf_size)
int
av_opencl_buffer_read
(
uint8_t
*
dst_buf
,
cl_mem
src_cl_buf
,
size_t
buf_size
)
{
cl_int
status
;
void
*
mapped
=
clEnqueueMapBuffer
(
gpu_env
.
command_queue
,
src_cl_buf
,
CL_TRUE
,
CL_MAP_READ
,
0
,
buf_size
,
void
*
mapped
=
clEnqueueMapBuffer
(
opencl_ctx
.
command_queue
,
src_cl_buf
,
CL_TRUE
,
CL_MAP_READ
,
0
,
buf_size
,
0
,
NULL
,
NULL
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not map OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
memcpy
(
dst_buf
,
mapped
,
buf_size
);
status
=
clEnqueueUnmapMemObject
(
gpu_env
.
command_queue
,
src_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
status
=
clEnqueueUnmapMemObject
(
opencl_ctx
.
command_queue
,
src_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not unmap OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
@@ -763,15 +753,15 @@ int av_opencl_buffer_write_image(cl_mem dst_cl_buf, size_t cl_buffer_size, int d
buffer_size
+=
plane_size
[
i
];
}
if
(
buffer_size
>
cl_buffer_size
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Cannot write image to OpenCL buffer: buffer too small
\n
"
);
return
AVERROR
(
EINVAL
);
}
mapped
=
clEnqueueMapBuffer
(
gpu_env
.
command_queue
,
dst_cl_buf
,
CL_TRUE
,
CL_MAP_WRITE
,
0
,
buffer_size
+
dst_cl_offset
,
mapped
=
clEnqueueMapBuffer
(
opencl_ctx
.
command_queue
,
dst_cl_buf
,
CL_TRUE
,
CL_MAP_WRITE
,
0
,
buffer_size
+
dst_cl_offset
,
0
,
NULL
,
NULL
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not map OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
@@ -781,9 +771,9 @@ int av_opencl_buffer_write_image(cl_mem dst_cl_buf, size_t cl_buffer_size, int d
memcpy
(
temp
,
src_data
[
i
],
plane_size
[
i
]);
temp
+=
plane_size
[
i
];
}
status
=
clEnqueueUnmapMemObject
(
gpu_env
.
command_queue
,
dst_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
status
=
clEnqueueUnmapMemObject
(
opencl_ctx
.
command_queue
,
dst_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not unmap OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
@@ -804,16 +794,16 @@ int av_opencl_buffer_read_image(uint8_t **dst_data, int *plane_size, int plane_n
buffer_size
+=
plane_size
[
i
];
}
if
(
buffer_size
>
cl_buffer_size
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Cannot write image to CPU buffer: OpenCL buffer too small
\n
"
);
return
AVERROR
(
EINVAL
);
}
mapped
=
clEnqueueMapBuffer
(
gpu_env
.
command_queue
,
src_cl_buf
,
CL_TRUE
,
CL_MAP_READ
,
0
,
buffer_size
,
mapped
=
clEnqueueMapBuffer
(
opencl_ctx
.
command_queue
,
src_cl_buf
,
CL_TRUE
,
CL_MAP_READ
,
0
,
buffer_size
,
0
,
NULL
,
NULL
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not map OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
@@ -824,9 +814,9 @@ int av_opencl_buffer_read_image(uint8_t **dst_data, int *plane_size, int plane_n
temp
+=
plane_size
[
i
];
}
}
status
=
clEnqueueUnmapMemObject
(
gpu_env
.
command_queue
,
src_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
status
=
clEnqueueUnmapMemObject
(
opencl_ctx
.
command_queue
,
src_cl_buf
,
mapped
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
{
av_log
(
&
opencl
utils
,
AV_LOG_ERROR
,
av_log
(
&
opencl
_ctx
,
AV_LOG_ERROR
,
"Could not unmap OpenCL buffer: %s
\n
"
,
opencl_errstr
(
status
));
return
AVERROR_EXTERNAL
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment