@@ -374,252 +374,6 @@ TEST_P(VulkanExternalImageTest, TextureFormatCompatChromiumZirconHandle)
374374 }
375375}
376376
377- // Test creating and clearing RGBA8 texture in opaque fd with acquire/release.
378- TEST_P (VulkanExternalImageTest, ShouldClearOpaqueFdWithSemaphores)
379- {
380- ANGLE_SKIP_TEST_IF (!EnsureGLExtensionEnabled (" GL_EXT_memory_object_fd" ));
381- ANGLE_SKIP_TEST_IF (!EnsureGLExtensionEnabled (" GL_EXT_semaphore_fd" ));
382-
383- VulkanExternalHelper helper;
384- helper.initialize (isSwiftshader ());
385-
386- VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
387- ANGLE_SKIP_TEST_IF (
388- !helper.canCreateImageOpaqueFd (format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL));
389- ANGLE_SKIP_TEST_IF (!helper.canCreateSemaphoreOpaqueFd ());
390-
391- VkSemaphore vkAcquireSemaphore = VK_NULL_HANDLE;
392- VkResult result = helper.createSemaphoreOpaqueFd (&vkAcquireSemaphore);
393- EXPECT_EQ (result, VK_SUCCESS);
394- EXPECT_TRUE (vkAcquireSemaphore != VK_NULL_HANDLE);
395-
396- VkSemaphore vkReleaseSemaphore = VK_NULL_HANDLE;
397- result = helper.createSemaphoreOpaqueFd (&vkReleaseSemaphore);
398- EXPECT_EQ (result, VK_SUCCESS);
399- EXPECT_TRUE (vkReleaseSemaphore != VK_NULL_HANDLE);
400-
401- int acquireSemaphoreFd = kInvalidFd ;
402- result = helper.exportSemaphoreOpaqueFd (vkAcquireSemaphore, &acquireSemaphoreFd);
403- EXPECT_EQ (result, VK_SUCCESS);
404- EXPECT_NE (acquireSemaphoreFd, kInvalidFd );
405-
406- int releaseSemaphoreFd = kInvalidFd ;
407- result = helper.exportSemaphoreOpaqueFd (vkReleaseSemaphore, &releaseSemaphoreFd);
408- EXPECT_EQ (result, VK_SUCCESS);
409- EXPECT_NE (releaseSemaphoreFd, kInvalidFd );
410-
411- VkImage image = VK_NULL_HANDLE;
412- VkDeviceMemory deviceMemory = VK_NULL_HANDLE;
413- VkDeviceSize deviceMemorySize = 0 ;
414-
415- VkExtent3D extent = {1 , 1 , 1 };
416- result = helper.createImage2DOpaqueFd (format, extent, &image, &deviceMemory, &deviceMemorySize);
417- EXPECT_EQ (result, VK_SUCCESS);
418-
419- int memoryFd = kInvalidFd ;
420- result = helper.exportMemoryOpaqueFd (deviceMemory, &memoryFd);
421- EXPECT_EQ (result, VK_SUCCESS);
422- EXPECT_NE (memoryFd, kInvalidFd );
423-
424- {
425- GLMemoryObject memoryObject;
426- GLint dedicatedMemory = GL_TRUE;
427- glMemoryObjectParameterivEXT (memoryObject, GL_DEDICATED_MEMORY_OBJECT_EXT,
428- &dedicatedMemory);
429- glImportMemoryFdEXT (memoryObject, deviceMemorySize, GL_HANDLE_TYPE_OPAQUE_FD_EXT, memoryFd);
430-
431- GLTexture texture;
432- glBindTexture (GL_TEXTURE_2D, texture);
433- glTexStorageMem2DEXT (GL_TEXTURE_2D, 1 , GL_RGBA8, 1 , 1 , memoryObject, 0 );
434-
435- GLSemaphore glAcquireSemaphore;
436- glImportSemaphoreFdEXT (glAcquireSemaphore, GL_HANDLE_TYPE_OPAQUE_FD_EXT,
437- acquireSemaphoreFd);
438-
439- helper.releaseImageAndSignalSemaphore (image, VK_IMAGE_LAYOUT_UNDEFINED,
440- VK_IMAGE_LAYOUT_GENERAL, vkAcquireSemaphore);
441-
442- const GLuint barrierTextures[] = {
443- texture,
444- };
445- constexpr uint32_t textureBarriersCount = std::extent<decltype (barrierTextures)>();
446- const GLenum textureSrcLayouts[] = {
447- GL_LAYOUT_GENERAL_EXT,
448- };
449- constexpr uint32_t textureSrcLayoutsCount = std::extent<decltype (textureSrcLayouts)>();
450- static_assert (textureBarriersCount == textureSrcLayoutsCount,
451- " barrierTextures and textureSrcLayouts must be the same length" );
452- glWaitSemaphoreEXT (glAcquireSemaphore, 0 , nullptr , textureBarriersCount, barrierTextures,
453- textureSrcLayouts);
454-
455- GLFramebuffer framebuffer;
456- glBindFramebuffer (GL_FRAMEBUFFER, framebuffer);
457- glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0 );
458-
459- glClearColor (0 .5f , 0 .5f , 0 .5f , 0 .5f );
460- glClear (GL_COLOR_BUFFER_BIT);
461-
462- GLSemaphore glReleaseSemaphore;
463- glImportSemaphoreFdEXT (glReleaseSemaphore, GL_HANDLE_TYPE_OPAQUE_FD_EXT,
464- releaseSemaphoreFd);
465-
466- const GLenum textureDstLayouts[] = {
467- GL_LAYOUT_TRANSFER_SRC_EXT,
468- };
469- constexpr uint32_t textureDstLayoutsCount = std::extent<decltype (textureSrcLayouts)>();
470- static_assert (textureBarriersCount == textureDstLayoutsCount,
471- " barrierTextures and textureDstLayouts must be the same length" );
472- glSignalSemaphoreEXT (glReleaseSemaphore, 0 , nullptr , textureBarriersCount, barrierTextures,
473- textureDstLayouts);
474-
475- helper.waitSemaphoreAndAcquireImage (image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
476- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
477- vkReleaseSemaphore);
478- uint8_t pixels[4 ];
479- VkOffset3D offset = {};
480- VkExtent3D extent = {1 , 1 , 1 };
481- helper.readPixels (image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, format, offset, extent,
482- pixels, sizeof (pixels));
483-
484- EXPECT_NEAR (0x80 , pixels[0 ], 1 );
485- EXPECT_NEAR (0x80 , pixels[1 ], 1 );
486- EXPECT_NEAR (0x80 , pixels[2 ], 1 );
487- EXPECT_NEAR (0x80 , pixels[3 ], 1 );
488- }
489-
490- EXPECT_GL_NO_ERROR ();
491-
492- vkDeviceWaitIdle (helper.getDevice ());
493- vkDestroyImage (helper.getDevice (), image, nullptr );
494- vkDestroySemaphore (helper.getDevice (), vkAcquireSemaphore, nullptr );
495- vkDestroySemaphore (helper.getDevice (), vkReleaseSemaphore, nullptr );
496- vkFreeMemory (helper.getDevice (), deviceMemory, nullptr );
497- }
498-
499- // Test creating and clearing RGBA8 texture in zircon vmo with acquire/release.
500- TEST_P (VulkanExternalImageTest, ShouldClearZirconVmoWithSemaphores)
501- {
502- ANGLE_SKIP_TEST_IF (!EnsureGLExtensionEnabled (" GL_ANGLE_memory_object_fuchsia" ));
503- ANGLE_SKIP_TEST_IF (!EnsureGLExtensionEnabled (" GL_ANGLE_semaphore_fuchsia" ));
504-
505- VulkanExternalHelper helper;
506- helper.initialize (isSwiftshader ());
507-
508- VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
509- ANGLE_SKIP_TEST_IF (
510- !helper.canCreateImageZirconVmo (format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL));
511- ANGLE_SKIP_TEST_IF (!helper.canCreateSemaphoreZirconEvent ());
512-
513- VkSemaphore vkAcquireSemaphore = VK_NULL_HANDLE;
514- VkResult result = helper.createSemaphoreZirconEvent (&vkAcquireSemaphore);
515- EXPECT_EQ (result, VK_SUCCESS);
516- EXPECT_TRUE (vkAcquireSemaphore != VK_NULL_HANDLE);
517-
518- VkSemaphore vkReleaseSemaphore = VK_NULL_HANDLE;
519- result = helper.createSemaphoreZirconEvent (&vkReleaseSemaphore);
520- EXPECT_EQ (result, VK_SUCCESS);
521- EXPECT_TRUE (vkReleaseSemaphore != VK_NULL_HANDLE);
522-
523- zx_handle_t acquireSemaphoreHandle = ZX_HANDLE_INVALID;
524- result = helper.exportSemaphoreZirconEvent (vkAcquireSemaphore, &acquireSemaphoreHandle);
525- EXPECT_EQ (result, VK_SUCCESS);
526- EXPECT_NE (acquireSemaphoreHandle, ZX_HANDLE_INVALID);
527-
528- zx_handle_t releaseSemaphoreHandle = ZX_HANDLE_INVALID;
529- result = helper.exportSemaphoreZirconEvent (vkReleaseSemaphore, &releaseSemaphoreHandle);
530- EXPECT_EQ (result, VK_SUCCESS);
531- EXPECT_NE (releaseSemaphoreHandle, ZX_HANDLE_INVALID);
532-
533- VkImage image = VK_NULL_HANDLE;
534- VkDeviceMemory deviceMemory = VK_NULL_HANDLE;
535- VkDeviceSize deviceMemorySize = 0 ;
536-
537- VkExtent3D extent = {1 , 1 , 1 };
538- result =
539- helper.createImage2DZirconVmo (format, extent, &image, &deviceMemory, &deviceMemorySize);
540- EXPECT_EQ (result, VK_SUCCESS);
541-
542- zx_handle_t memoryHandle = ZX_HANDLE_INVALID;
543- result = helper.exportMemoryZirconVmo (deviceMemory, &memoryHandle);
544- EXPECT_EQ (result, VK_SUCCESS);
545- EXPECT_NE (memoryHandle, ZX_HANDLE_INVALID);
546-
547- {
548- GLMemoryObject memoryObject;
549- GLint dedicatedMemory = GL_TRUE;
550- glMemoryObjectParameterivEXT (memoryObject, GL_DEDICATED_MEMORY_OBJECT_EXT,
551- &dedicatedMemory);
552- glImportMemoryZirconHandleANGLE (memoryObject, deviceMemorySize,
553- GL_HANDLE_TYPE_ZIRCON_VMO_ANGLE, memoryHandle);
554-
555- GLTexture texture;
556- glBindTexture (GL_TEXTURE_2D, texture);
557- glTexStorageMem2DEXT (GL_TEXTURE_2D, 1 , GL_RGBA8, 1 , 1 , memoryObject, 0 );
558-
559- GLSemaphore glAcquireSemaphore;
560- glImportSemaphoreZirconHandleANGLE (glAcquireSemaphore, GL_HANDLE_TYPE_ZIRCON_EVENT_ANGLE,
561- acquireSemaphoreHandle);
562-
563- helper.releaseImageAndSignalSemaphore (image, VK_IMAGE_LAYOUT_UNDEFINED,
564- VK_IMAGE_LAYOUT_GENERAL, vkAcquireSemaphore);
565-
566- const GLuint barrierTextures[] = {
567- texture,
568- };
569- constexpr uint32_t textureBarriersCount = std::extent<decltype (barrierTextures)>();
570- const GLenum textureSrcLayouts[] = {
571- GL_LAYOUT_GENERAL_EXT,
572- };
573- constexpr uint32_t textureSrcLayoutsCount = std::extent<decltype (textureSrcLayouts)>();
574- static_assert (textureBarriersCount == textureSrcLayoutsCount,
575- " barrierTextures and textureSrcLayouts must be the same length" );
576- glWaitSemaphoreEXT (glAcquireSemaphore, 0 , nullptr , textureBarriersCount, barrierTextures,
577- textureSrcLayouts);
578-
579- GLFramebuffer framebuffer;
580- glBindFramebuffer (GL_FRAMEBUFFER, framebuffer);
581- glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0 );
582-
583- glClearColor (0 .5f , 0 .5f , 0 .5f , 0 .5f );
584- glClear (GL_COLOR_BUFFER_BIT);
585-
586- GLSemaphore glReleaseSemaphore;
587- glImportSemaphoreZirconHandleANGLE (glReleaseSemaphore, GL_HANDLE_TYPE_ZIRCON_EVENT_ANGLE,
588- releaseSemaphoreHandle);
589-
590- const GLenum textureDstLayouts[] = {
591- GL_LAYOUT_TRANSFER_SRC_EXT,
592- };
593- constexpr uint32_t textureDstLayoutsCount = std::extent<decltype (textureSrcLayouts)>();
594- static_assert (textureBarriersCount == textureDstLayoutsCount,
595- " barrierTextures and textureDstLayouts must be the same length" );
596- glSignalSemaphoreEXT (glReleaseSemaphore, 0 , nullptr , textureBarriersCount, barrierTextures,
597- textureDstLayouts);
598-
599- helper.waitSemaphoreAndAcquireImage (image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
600- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
601- vkReleaseSemaphore);
602- uint8_t pixels[4 ];
603- VkOffset3D offset = {};
604- VkExtent3D extent = {1 , 1 , 1 };
605- helper.readPixels (image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, format, offset, extent,
606- pixels, sizeof (pixels));
607-
608- EXPECT_NEAR (0x80 , pixels[0 ], 1 );
609- EXPECT_NEAR (0x80 , pixels[1 ], 1 );
610- EXPECT_NEAR (0x80 , pixels[2 ], 1 );
611- EXPECT_NEAR (0x80 , pixels[3 ], 1 );
612- }
613-
614- EXPECT_GL_NO_ERROR ();
615-
616- vkDeviceWaitIdle (helper.getDevice ());
617- vkDestroyImage (helper.getDevice (), image, nullptr );
618- vkDestroySemaphore (helper.getDevice (), vkAcquireSemaphore, nullptr );
619- vkDestroySemaphore (helper.getDevice (), vkReleaseSemaphore, nullptr );
620- vkFreeMemory (helper.getDevice (), deviceMemory, nullptr );
621- }
622-
623377// Use this to select which configurations (e.g. which renderer, which GLES major version) these
624378// tests should be run against.
625379ANGLE_INSTANTIATE_TEST_ES2_AND_ES3 (VulkanExternalImageTest);
0 commit comments