@@ -48,6 +48,116 @@ TEST_F(WithCommandQueue, FailedAndCompleteDependencies) {
4848 ASSERT_EQ (err, CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
4949}
5050
51+ TEST_F (WithCommandQueue, CheckMapBufferRemovesMappingIfDependenciesFailed) {
52+ // Create buffer
53+ auto buffer = CreateBuffer (CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR,
54+ BUFFER_SIZE, nullptr );
55+
56+ // Create user events
57+ auto event = CreateUserEvent ();
58+
59+ // Make its status a failure
60+ SetUserEventStatus (event, CL_INVALID_OPERATION);
61+
62+ cl_int err;
63+
64+ // Check that a map buffer that depends on it fails (and rely on tooling to
65+ // check that the mapping is cleaned up)
66+ cl_event dep = event;
67+ clEnqueueMapBuffer (m_queue, buffer, CL_TRUE, CL_MAP_WRITE_INVALIDATE_REGION,
68+ 0 , BUFFER_SIZE, 1 , &dep, nullptr , &err);
69+
70+ ASSERT_EQ (err, CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
71+ }
72+
73+ TEST_F (WithCommandQueue, CheckMapImageRemovesMappingIfDependenciesFailed) {
74+ // Create image
75+ const size_t IMAGE_WIDTH = 97 ;
76+ const size_t IMAGE_HEIGHT = 13 ;
77+
78+ cl_image_format format = {CL_R, CL_UNSIGNED_INT8};
79+ cl_image_desc desc = {
80+ CL_MEM_OBJECT_IMAGE2D, // image_type
81+ IMAGE_WIDTH, // image_width
82+ IMAGE_HEIGHT, // image_height
83+ 1 , // image_depth
84+ 1 , // image_array_size
85+ 0 , // image_row_pitch
86+ 0 , // image_slice_pitch
87+ 0 , // num_mip_levels
88+ 0 , // num_samples
89+ nullptr , // buffer
90+ };
91+
92+ auto image = CreateImage (CL_MEM_READ_WRITE, &format, &desc);
93+
94+ // Create user event
95+ auto event = CreateUserEvent ();
96+
97+ // Make its status a failure
98+ SetUserEventStatus (event, CL_INVALID_OPERATION);
99+
100+ cl_int err;
101+ size_t origin[3 ] = {0 , 0 , 0 };
102+ size_t region[3 ] = {IMAGE_WIDTH, IMAGE_HEIGHT, 1 };
103+ size_t row_pitch;
104+
105+ // Check that a map image that depends on it fails (and rely on tooling to
106+ // check that the mapping is cleaned up)
107+ cl_event dep = event;
108+ clEnqueueMapImage (m_queue, image, CL_TRUE, CL_MAP_WRITE_INVALIDATE_REGION,
109+ origin, region, &row_pitch, nullptr , 1 , &dep, nullptr ,
110+ &err);
111+
112+ ASSERT_EQ (err, CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
113+ }
114+
115+ TEST_F (WithCommandQueue,
116+ CheckMapImage1DBufferRemovesMappingIfDependenciesFailed) {
117+
118+ // Create 1D Buffer image
119+ const size_t IMAGE_WIDTH = 128 ;
120+
121+ auto buffer_size = IMAGE_WIDTH * sizeof (cl_float4);
122+ auto buffer = CreateBuffer (CL_MEM_READ_WRITE, buffer_size, nullptr );
123+
124+ cl_image_format format = {CL_RGBA, CL_FLOAT};
125+ cl_image_desc desc = {
126+ CL_MEM_OBJECT_IMAGE1D_BUFFER, // image_type
127+ IMAGE_WIDTH, // image_width
128+ 1 , // image_height
129+ 1 , // image_depth
130+ 1 , // image_array_size
131+ 0 , // image_row_pitch
132+ 0 , // image_slice_pitch
133+ 0 , // num_mip_levels
134+ 0 , // num_samples
135+ buffer, // buffer
136+ };
137+
138+ auto image = CreateImage (CL_MEM_READ_WRITE, &format, &desc);
139+
140+ // Create user event
141+ auto event = CreateUserEvent ();
142+
143+ // Make its status a failure
144+ SetUserEventStatus (event, CL_INVALID_OPERATION);
145+
146+ cl_int err;
147+ size_t origin[3 ] = {0 , 0 , 0 };
148+ size_t region[3 ] = {IMAGE_WIDTH, 1 , 1 };
149+ size_t row_pitch;
150+
151+ // Check that a map image that depends on it fails (and rely on tooling to
152+ // check that the mapping is cleaned up)
153+ cl_event dep = event;
154+ clEnqueueMapImage (m_queue, image, CL_TRUE, CL_MAP_WRITE_INVALIDATE_REGION,
155+ origin, region, &row_pitch, nullptr , 1 , &dep, nullptr ,
156+ &err);
157+
158+ ASSERT_EQ (err, CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
159+ }
160+
51161TEST_F (WithCommandQueue, InOrderQueueStopsExecutionAfterFailedCommand) {
52162 auto buffer = CreateBuffer (CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR,
53163 BUFFER_SIZE, nullptr );
0 commit comments