Command buffer re-enqueue testing. (#1738)

* Command buffer re-enqueue testing.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Remove reenqueue tests and add reenqueue to existing tests.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Add re-enqueue for copy and barrier tests.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Fix review comments.

Applied review comments for command buffer re-enqueue testing:
- Add second clEnqueueCommandBufferKHR for all tests
- Reinitialise memory before second enqueue of command buffers
- Add different patterns for second enqueue of command buffers

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Fix verification patterns for second enqueue tests.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Reinitialise output memory for second command buffer re-enqueue.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Fix cast for conversion from 'const cl_char' to 'const cl_uint.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Fix compilation error for MSVC.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Reinitialise in_mem and out_mem with zero.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

* Fix cast for conversion from 'const cl_int' to 'const cl_uint'.

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>

---------

Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>
This commit is contained in:
Paweł Jastrzębski
2023-06-27 17:47:24 +02:00
committed by GitHub
parent 73ead9da04
commit fee6d6bb66
4 changed files with 277 additions and 48 deletions

View File

@@ -201,14 +201,33 @@ struct BasicEnqueueTest : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_int> output_data(num_elements);
std::vector<cl_int> output_data_1(num_elements);
error = clEnqueueReadBuffer(queue, out_mem, CL_TRUE, 0, data_size(),
output_data.data(), 0, nullptr, nullptr);
output_data_1.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < num_elements; i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data[i], i);
CHECK_VERIFICATION_ERROR(pattern, output_data_1[i], i);
}
const cl_int new_pattern = 12;
error = clEnqueueFillBuffer(queue, in_mem, &new_pattern, sizeof(cl_int),
0, data_size(), 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBuffer failed");
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_int> output_data_2(num_elements);
error = clEnqueueReadBuffer(queue, out_mem, CL_TRUE, 0, data_size(),
output_data_2.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < num_elements; i++)
{
CHECK_VERIFICATION_ERROR(new_pattern, output_data_2[i], i);
}
return CL_SUCCESS;

View File

@@ -70,15 +70,42 @@ struct BarrierWithWaitListKHR : public BasicCommandBufferTest
0, nullptr, out_of_order_command_buffer, 0, nullptr, &event);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_int> output_data(num_elements);
std::vector<cl_int> output_data_1(num_elements);
error = clEnqueueReadBuffer(out_of_order_queue, out_mem, CL_TRUE, 0,
data_size(), output_data.data(), 1, &event,
nullptr);
data_size(), output_data_1.data(), 1,
&event, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < num_elements; i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data[i], i);
CHECK_VERIFICATION_ERROR(pattern, output_data_1[i], i);
}
/* Check second enqueue of command buffer */
error =
clEnqueueFillBuffer(queue, in_mem, &zero_pattern, sizeof(cl_int), 0,
data_size(), 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBufferKHR failed");
error =
clEnqueueFillBuffer(queue, out_mem, &zero_pattern, sizeof(cl_int),
0, data_size(), 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBufferKHR failed");
error = clEnqueueCommandBufferKHR(
0, nullptr, out_of_order_command_buffer, 0, nullptr, &event);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_int> output_data_2(num_elements);
error = clEnqueueReadBuffer(out_of_order_queue, out_mem, CL_TRUE, 0,
data_size(), output_data_2.data(), 1,
&event, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < num_elements; i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data_2[i], i);
}
return CL_SUCCESS;
@@ -106,6 +133,7 @@ struct BarrierWithWaitListKHR : public BasicCommandBufferTest
}
const cl_int pattern = 0x16;
const cl_int zero_pattern = 0x0;
clCommandQueueWrapper out_of_order_queue;
clCommandBufferWrapper out_of_order_command_buffer;
clEventWrapper event;

View File

@@ -38,7 +38,7 @@ struct CopyImageKHR : public BasicCommandBufferTest
cl_int Run() override
{
cl_int error = clCommandFillImageKHR(command_buffer, nullptr, src_image,
fill_color, origin, region, 0,
fill_color_1, origin, region, 0,
nullptr, nullptr, nullptr);
test_error(error, "clCommandFillImageKHR failed");
@@ -56,13 +56,38 @@ struct CopyImageKHR : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data(data_size);
error = clEnqueueReadImage(queue, dst_image, CL_TRUE, origin, region, 0,
0, output_data.data(), 0, nullptr, nullptr);
std::vector<cl_char> output_data_1(data_size);
error =
clEnqueueReadImage(queue, dst_image, CL_TRUE, origin, region, 0, 0,
output_data_1.data(), 0, nullptr, nullptr);
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data[i], i);
CHECK_VERIFICATION_ERROR(pattern_1, output_data_1[i], i);
}
/* Check second enqueue of command buffer */
error = clEnqueueFillImage(queue, src_image, fill_color_2, origin,
region, 0, nullptr, nullptr);
test_error(error, "clEnqueueFillImageKHR failed");
error = clEnqueueFillImage(queue, dst_image, fill_color_2, origin,
region, 0, nullptr, nullptr);
test_error(error, "clEnqueueFillImageKHR failed");
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data_2(data_size);
error =
clEnqueueReadImage(queue, dst_image, CL_TRUE, origin, region, 0, 0,
output_data_2.data(), 0, nullptr, nullptr);
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(pattern_1, output_data_2[i], i);
}
return CL_SUCCESS;
@@ -97,8 +122,12 @@ struct CopyImageKHR : public BasicCommandBufferTest
const size_t data_size = img_width * img_height * 4 * sizeof(cl_char);
const size_t origin[3] = { 0, 0, 0 },
region[3] = { img_width, img_height, 1 };
const cl_uint pattern = 0x05;
const cl_uint fill_color[4] = { pattern, pattern, pattern, pattern };
const cl_uint pattern_1 = 0x05;
const cl_uint fill_color_1[4] = { pattern_1, pattern_1, pattern_1,
pattern_1 };
const cl_uint pattern_2 = 0x1;
const cl_uint fill_color_2[4] = { pattern_2, pattern_2, pattern_2,
pattern_2 };
const cl_image_format formats = { CL_RGBA, CL_UNSIGNED_INT8 };
clMemWrapper src_image;
clMemWrapper dst_image;
@@ -111,7 +140,7 @@ struct CopyBufferKHR : public BasicCommandBufferTest
cl_int Run() override
{
cl_int error = clCommandFillBufferKHR(
command_buffer, nullptr, in_mem, &pattern, sizeof(cl_char), 0,
command_buffer, nullptr, in_mem, &pattern_1, sizeof(cl_char), 0,
data_size(), 0, nullptr, nullptr, nullptr);
test_error(error, "clCommandFillBufferKHR failed");
@@ -127,20 +156,45 @@ struct CopyBufferKHR : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data(data_size());
std::vector<cl_char> output_data_1(data_size());
error = clEnqueueReadBuffer(queue, out_mem, CL_TRUE, 0, data_size(),
output_data.data(), 0, nullptr, nullptr);
output_data_1.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size(); i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data[i], i);
CHECK_VERIFICATION_ERROR(pattern_1, output_data_1[i], i);
}
/* Check second enqueue of command buffer */
error = clEnqueueFillBuffer(queue, in_mem, &pattern_2, sizeof(cl_char),
0, data_size(), 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBufferKHR failed");
error = clEnqueueFillBuffer(queue, out_mem, &pattern_2, sizeof(cl_char),
0, data_size(), 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBufferKHR failed");
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data_2(data_size());
error = clEnqueueReadBuffer(queue, out_mem, CL_TRUE, 0, data_size(),
output_data_2.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size(); i++)
{
CHECK_VERIFICATION_ERROR(pattern_1, output_data_2[i], i);
}
return CL_SUCCESS;
}
const cl_char pattern = 0x14;
const cl_char pattern_1 = 0x14;
const cl_char pattern_2 = 0x28;
};
struct CopyBufferToImageKHR : public BasicCommandBufferTest
@@ -150,7 +204,7 @@ struct CopyBufferToImageKHR : public BasicCommandBufferTest
cl_int Run() override
{
cl_int error = clCommandFillBufferKHR(
command_buffer, nullptr, buffer, &pattern, sizeof(cl_char), 0,
command_buffer, nullptr, buffer, &pattern_1, sizeof(cl_char), 0,
data_size, 0, nullptr, nullptr, nullptr);
test_error(error, "clCommandFillBufferKHR failed");
@@ -168,15 +222,40 @@ struct CopyBufferToImageKHR : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data(data_size);
std::vector<cl_char> output_data_1(data_size);
error = clEnqueueReadImage(queue, image, CL_TRUE, origin, region, 0, 0,
output_data.data(), 0, nullptr, nullptr);
output_data_1.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadImage failed");
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data[i], i);
CHECK_VERIFICATION_ERROR(pattern_1, output_data_1[i], i);
}
/* Check second enqueue of command buffer */
error = clEnqueueFillBuffer(queue, buffer, &pattern_2, sizeof(cl_char),
0, data_size, 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBuffer failed");
error = clEnqueueFillImage(queue, image, &fill_color_2, origin, region,
0, nullptr, nullptr);
test_error(error, "clEnqueueFillImage failed");
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data_2(data_size);
error = clEnqueueReadImage(queue, image, CL_TRUE, origin, region, 0, 0,
output_data_2.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadImage failed");
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(pattern_1, output_data_2[i], i);
}
return CL_SUCCESS;
@@ -211,7 +290,14 @@ struct CopyBufferToImageKHR : public BasicCommandBufferTest
const size_t data_size = img_width * img_height * 4 * sizeof(cl_char);
const size_t origin[3] = { 0, 0, 0 },
region[3] = { img_width, img_height, 1 };
const cl_char pattern = 0x11;
const cl_char pattern_1 = 0x11;
const cl_char pattern_2 = 0x22;
const cl_uint fill_color_2[4] = { static_cast<cl_uint>(pattern_2),
static_cast<cl_uint>(pattern_2),
static_cast<cl_uint>(pattern_2),
static_cast<cl_uint>(pattern_2) };
const cl_image_format formats = { CL_RGBA, CL_UNSIGNED_INT8 };
clMemWrapper buffer;
@@ -225,7 +311,7 @@ struct CopyImageToBufferKHR : public BasicCommandBufferTest
cl_int Run() override
{
cl_int error =
clCommandFillImageKHR(command_buffer, nullptr, image, fill_color,
clCommandFillImageKHR(command_buffer, nullptr, image, fill_color_1,
origin, region, 0, nullptr, nullptr, nullptr);
test_error(error, "clCommandFillImageKHR failed");
@@ -243,16 +329,39 @@ struct CopyImageToBufferKHR : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data(data_size);
std::vector<cl_char> output_data_1(data_size);
error = clEnqueueReadBuffer(queue, buffer, CL_TRUE, 0, data_size,
output_data.data(), 0, nullptr, nullptr);
output_data_1.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(static_cast<cl_char>(pattern),
output_data[i], i);
CHECK_VERIFICATION_ERROR(static_cast<cl_char>(pattern_1),
output_data_1[i], i);
}
error = clEnqueueFillImage(queue, image, fill_color_2, origin, region,
0, nullptr, nullptr);
test_error(error, "clEnqueueFillImage failed");
error = clEnqueueFillBuffer(queue, buffer, &pattern_2, sizeof(cl_char),
0, data_size, 0, nullptr, nullptr);
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data_2(data_size);
error = clEnqueueReadBuffer(queue, buffer, CL_TRUE, 0, data_size,
output_data_2.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(static_cast<cl_char>(pattern_1),
output_data_2[i], i);
}
return CL_SUCCESS;
@@ -287,8 +396,12 @@ struct CopyImageToBufferKHR : public BasicCommandBufferTest
const size_t data_size = img_width * img_height * 4 * sizeof(cl_char);
const size_t origin[3] = { 0, 0, 0 },
region[3] = { img_width, img_height, 1 };
const cl_uint pattern = 0x12;
const cl_uint fill_color[4] = { pattern, pattern, pattern, pattern };
const cl_uint pattern_1 = 0x12;
const cl_uint fill_color_1[4] = { pattern_1, pattern_1, pattern_1,
pattern_1 };
const cl_uint pattern_2 = 0x24;
const cl_uint fill_color_2[4] = { pattern_2, pattern_2, pattern_2,
pattern_2 };
const cl_image_format formats = { CL_RGBA, CL_UNSIGNED_INT8 };
clMemWrapper image;
@@ -302,7 +415,7 @@ struct CopyBufferRectKHR : public BasicCommandBufferTest
cl_int Run() override
{
cl_int error = clCommandFillBufferKHR(
command_buffer, nullptr, in_mem, &pattern, sizeof(cl_char), 0,
command_buffer, nullptr, in_mem, &pattern_1, sizeof(cl_char), 0,
data_size, 0, nullptr, nullptr, nullptr);
test_error(error, "clCommandFillBufferKHR failed");
@@ -319,14 +432,38 @@ struct CopyBufferRectKHR : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data(data_size);
std::vector<cl_char> output_data_1(data_size);
error = clEnqueueReadBuffer(queue, out_mem, CL_TRUE, 0, data_size,
output_data.data(), 0, nullptr, nullptr);
output_data_1.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data[i], i);
CHECK_VERIFICATION_ERROR(pattern_1, output_data_1[i], i);
}
/* Check second enqueue of command buffer */
error = clEnqueueFillBuffer(queue, in_mem, &pattern_2, sizeof(cl_char),
0, data_size, 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBuffer failed");
error = clEnqueueFillBuffer(queue, out_mem, &pattern_2, sizeof(cl_char),
0, data_size, 0, nullptr, nullptr);
test_error(error, "clEnqueueFillBuffer failed");
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data_2(data_size);
error = clEnqueueReadBuffer(queue, out_mem, CL_TRUE, 0, data_size,
output_data_2.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(pattern_1, output_data_2[i], i);
}
return CL_SUCCESS;
@@ -353,7 +490,8 @@ struct CopyBufferRectKHR : public BasicCommandBufferTest
const size_t data_size = img_width * img_height * sizeof(cl_char);
const size_t origin[3] = { 0, 0, 0 },
region[3] = { img_width, img_height, 1 };
const cl_char pattern = 0x13;
const cl_char pattern_1 = 0x13;
const cl_char pattern_2 = 0x26;
clMemWrapper in_mem;
clMemWrapper out_mem;

View File

@@ -35,7 +35,7 @@ struct FillImageKHR : public BasicCommandBufferTest
cl_int Run() override
{
cl_int error =
clCommandFillImageKHR(command_buffer, nullptr, image, fill_color,
clCommandFillImageKHR(command_buffer, nullptr, image, fill_color_1,
origin, region, 0, nullptr, nullptr, nullptr);
test_error(error, "clCommandFillImageKHR failed");
@@ -47,14 +47,34 @@ struct FillImageKHR : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data(data_size);
std::vector<cl_char> output_data_1(data_size);
error = clEnqueueReadImage(queue, image, CL_TRUE, origin, region, 0, 0,
output_data.data(), 0, nullptr, nullptr);
output_data_1.data(), 0, nullptr, nullptr);
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(static_cast<cl_char>(pattern),
output_data[i], i);
CHECK_VERIFICATION_ERROR(static_cast<cl_char>(pattern_1),
output_data_1[i], i);
}
/* Check second enqueue of command buffer */
error = clEnqueueFillImage(queue, image, fill_color_2, origin, region,
0, nullptr, nullptr);
test_error(error, "clEnqueueFillImage failed");
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data_2(data_size);
error = clEnqueueReadImage(queue, image, CL_TRUE, origin, region, 0, 0,
output_data_2.data(), 0, nullptr, nullptr);
for (size_t i = 0; i < data_size; i++)
{
CHECK_VERIFICATION_ERROR(static_cast<cl_char>(pattern_1),
output_data_2[i], i);
}
return CL_SUCCESS;
@@ -85,8 +105,12 @@ struct FillImageKHR : public BasicCommandBufferTest
const size_t data_size = img_width * img_height * 4 * sizeof(cl_char);
const size_t origin[3] = { 0, 0, 0 },
region[3] = { img_width, img_height, 1 };
const cl_uint pattern = 0x10;
const cl_uint fill_color[4] = { pattern, pattern, pattern, pattern };
const cl_uint pattern_1 = 0x10;
const cl_uint fill_color_1[4] = { pattern_1, pattern_1, pattern_1,
pattern_1 };
const cl_uint pattern_2 = 0x20;
const cl_uint fill_color_2[4] = { pattern_2, pattern_2, pattern_2,
pattern_2 };
const cl_image_format formats = { CL_RGBA, CL_UNSIGNED_INT8 };
clMemWrapper image;
@@ -99,7 +123,7 @@ struct FillBufferKHR : public BasicCommandBufferTest
cl_int Run() override
{
cl_int error = clCommandFillBufferKHR(
command_buffer, nullptr, in_mem, &pattern, sizeof(cl_char), 0,
command_buffer, nullptr, in_mem, &pattern_1, sizeof(cl_char), 0,
data_size(), 0, nullptr, nullptr, nullptr);
test_error(error, "clCommandFillBufferKHR failed");
@@ -111,20 +135,40 @@ struct FillBufferKHR : public BasicCommandBufferTest
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data(data_size());
std::vector<cl_char> output_data_1(data_size());
error = clEnqueueReadBuffer(queue, in_mem, CL_TRUE, 0, data_size(),
output_data.data(), 0, nullptr, nullptr);
output_data_1.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size(); i++)
{
CHECK_VERIFICATION_ERROR(pattern, output_data[i], i);
CHECK_VERIFICATION_ERROR(pattern_1, output_data_1[i], i);
}
/* Check second enqueue of command buffer */
clEnqueueFillBuffer(queue, in_mem, &pattern_2, sizeof(cl_char), 0,
data_size(), 0, nullptr, nullptr);
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
nullptr, nullptr);
test_error(error, "clEnqueueCommandBufferKHR failed");
std::vector<cl_char> output_data_2(data_size());
error = clEnqueueReadBuffer(queue, in_mem, CL_TRUE, 0, data_size(),
output_data_2.data(), 0, nullptr, nullptr);
test_error(error, "clEnqueueReadBuffer failed");
for (size_t i = 0; i < data_size(); i++)
{
CHECK_VERIFICATION_ERROR(pattern_1, output_data_2[i], i);
}
return CL_SUCCESS;
}
const char pattern = 0x15;
const char pattern_1 = 0x15;
const char pattern_2 = 0x30;
};
};