diff --git a/src/drm.cpp b/src/drm.cpp index 0e0cf95..b5c53f7 100644 --- a/src/drm.cpp +++ b/src/drm.cpp @@ -1109,8 +1109,8 @@ drm_prepare_basic( struct drm_t *drm, const struct FrameInfo_t *frameInfo ) add_plane_property(req, drm->primary, "SRC_X", 0); add_plane_property(req, drm->primary, "SRC_Y", 0); - const uint16_t srcWidth = frameInfo->layers[ 0 ].tex->m_width; - const uint16_t srcHeight = frameInfo->layers[ 0 ].tex->m_height; + const uint16_t srcWidth = frameInfo->layers[ 0 ].tex->width(); + const uint16_t srcHeight = frameInfo->layers[ 0 ].tex->height(); add_plane_property(req, drm->primary, "SRC_W", srcWidth << 16); add_plane_property(req, drm->primary, "SRC_H", srcHeight << 16); @@ -1174,8 +1174,8 @@ drm_prepare_liftoff( struct drm_t *drm, const struct FrameInfo_t *frameInfo ) liftoff_layer_set_property( drm->lo_layers[ i ], "zpos", frameInfo->layers[ i ].zpos ); liftoff_layer_set_property( drm->lo_layers[ i ], "alpha", frameInfo->layers[ i ].opacity * 0xffff); - const uint16_t srcWidth = frameInfo->layers[ i ].tex->m_width; - const uint16_t srcHeight = frameInfo->layers[ i ].tex->m_height; + const uint16_t srcWidth = frameInfo->layers[ i ].tex->width(); + const uint16_t srcHeight = frameInfo->layers[ i ].tex->height(); liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_X", 0); liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_Y", 0); diff --git a/src/pipewire.cpp b/src/pipewire.cpp index be2ec52..6af5e28 100644 --- a/src/pipewire.cpp +++ b/src/pipewire.cpp @@ -96,12 +96,12 @@ static void copy_buffer(struct pipewire_state *state, struct pipewire_buffer *bu { std::shared_ptr &tex = buffer->texture; assert(tex != nullptr); - assert(tex->m_format == VK_FORMAT_B8G8R8A8_UNORM); + assert(tex->format() == VK_FORMAT_B8G8R8A8_UNORM); struct pw_buffer *pw_buffer = buffer->buffer; struct spa_buffer *spa_buffer = pw_buffer->buffer; - bool needs_reneg = buffer->video_info.size.width != tex->m_width || buffer->video_info.size.height != tex->m_height; + bool needs_reneg = buffer->video_info.size.width != tex->width() || buffer->video_info.size.height != tex->height(); struct spa_meta_header *header = (struct spa_meta_header *) spa_buffer_find_meta_data(spa_buffer, SPA_META_Header, sizeof(*header)); if (header != nullptr) { @@ -123,13 +123,13 @@ static void copy_buffer(struct pipewire_state *state, struct pipewire_buffer *bu if (!needs_reneg) { int bpp = 4; - for (uint32_t i = 0; i < tex->m_height; i++) { - memcpy(buffer->shm.data + i * buffer->shm.stride, (uint8_t *) tex->m_pMappedData + i * tex->m_unRowPitch, bpp * tex->m_width); + for (uint32_t i = 0; i < tex->height(); i++) { + memcpy(buffer->shm.data + i * buffer->shm.stride, (uint8_t *) tex->mappedData() + i * tex->rowPitch(), bpp * tex->width()); } } break; case SPA_DATA_DmaBuf: - dmabuf = tex->m_dmabuf; + dmabuf = tex->dmabuf(); assert(dmabuf.n_planes == 1); chunk->offset = dmabuf.offset[0]; chunk->stride = dmabuf.stride[0]; @@ -306,7 +306,7 @@ static void stream_handle_add_buffer(void *user_data, struct pw_buffer *pw_buffe assert(buffer->texture != nullptr); if (is_dmabuf) { - const struct wlr_dmabuf_attributes dmabuf = buffer->texture->m_dmabuf; + const struct wlr_dmabuf_attributes dmabuf = buffer->texture->dmabuf(); assert(dmabuf.n_planes == 1); off_t size = lseek(dmabuf.fd[0], 0, SEEK_END); diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 1949dee..40c41cf 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -2063,8 +2063,8 @@ bool vulkan_init( void ) static void update_tmp_images( uint32_t width, uint32_t height ) { if ( g_output.tmpOutput != nullptr - && width == g_output.tmpOutput->m_width - && height == g_output.tmpOutput->m_height ) + && width == g_output.tmpOutput->width() + && height == g_output.tmpOutput->height() ) { return; } @@ -2248,14 +2248,14 @@ std::shared_ptr vulkan_create_texture_from_bits( uint32_t width, .newLayout = VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = pTex->m_vkImage, + .image = pTex->vkImage(), .subresourceRange = subResRange }; vkCmdPipelineBarrier( commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); - vkCmdCopyBufferToImage( commandBuffer, uploadBuffer, pTex->m_vkImage, VK_IMAGE_LAYOUT_GENERAL, 1, ®ion ); + vkCmdCopyBufferToImage( commandBuffer, uploadBuffer, pTex->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion ); memoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; memoryBarrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; @@ -2338,7 +2338,7 @@ VkDescriptorSet vulkan_update_descriptor( const struct FrameInfo_t *frameInfo, b bool compositeLayer = i > 0; VkImageView imageView = frameInfo->layers[i].tex - ? frameInfo->layers[i].tex->getView(compositeLayer || !firstSrgb) + ? frameInfo->layers[i].tex->view(compositeLayer || !firstSrgb) : VK_NULL_HANDLE; VulkanSamplerCacheKey_t samplerKey; @@ -2492,8 +2492,8 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_vkImage; - targetImageView = g_output.outputImage[ g_output.nOutImage ]->m_srgbView; + compositeImage = g_output.outputImage[ g_output.nOutImage ]->vkImage(); + targetImageView = g_output.outputImage[ g_output.nOutImage ]->srgbView(); } VkCommandBuffer curCommandBuffer = g_output.commandBuffers[ g_output.nCurCmdBuffer ]; @@ -2562,7 +2562,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrlayers[i].tex->m_vkImage; + textureBarriers[i].image = frameInfo->layers[i].tex->vkImage(); textureBarriers[i].subresourceRange = subResRange; } @@ -2622,21 +2622,21 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_width; - uint32_t inputY = fsrFrameInfo.layers[0].tex->m_height; + uint32_t inputX = fsrFrameInfo.layers[0].tex->width(); + uint32_t inputY = fsrFrameInfo.layers[0].tex->height(); uint32_t tempX = fsrFrameInfo.layers[0].integerWidth(); uint32_t tempY = fsrFrameInfo.layers[0].integerHeight(); update_tmp_images(tempX, tempY); - memoryBarrier.image = g_output.tmpOutput->m_vkImage; + memoryBarrier.image = g_output.tmpOutput->vkImage(); vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); vkCmdBindPipeline(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, easuPipeline); - VkDescriptorSet descriptorSet = vulkan_update_descriptor( &fsrFrameInfo, true, true, g_output.tmpOutput->m_srgbView ); + VkDescriptorSet descriptorSet = vulkan_update_descriptor( &fsrFrameInfo, true, true, g_output.tmpOutput->srgbView() ); vkCmdBindDescriptorSets(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout, 0, 1, &descriptorSet, 0, 0); @@ -2660,7 +2660,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_vkImage, + .image = g_output.tmpOutput->vkImage(), .subresourceRange = subResRange }; @@ -2704,7 +2704,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_vkImage; + memoryBarrier.image = g_output.tmpOutput->vkImage(); vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); @@ -2717,7 +2717,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_srgbView ); + VkDescriptorSet descriptorSet = vulkan_update_descriptor( &blurFrameInfo, false, false, g_output.tmpOutput->srgbView() ); vkCmdBindDescriptorSets(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout, 0, 1, &descriptorSet, 0, 0); @@ -2740,14 +2740,14 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_vkImage, + .image = g_output.tmpOutput->vkImage(), .subresourceRange = subResRange }; vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); - descriptorSet = vulkan_update_descriptor( &blurFrameInfo, false, false, targetImageView, g_output.tmpOutput->m_linearView ); + descriptorSet = vulkan_update_descriptor( &blurFrameInfo, false, false, targetImageView, g_output.tmpOutput->linearView() ); vkCmdBindDescriptorSets(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout, 0, 1, &descriptorSet, 0, 0); @@ -2803,7 +2803,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_vkImage, + .image = pScreenshotTexture->vkImage(), .subresourceRange = subResRange }; @@ -2846,7 +2846,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptrm_vkImage, VK_IMAGE_LAYOUT_GENERAL, 1, ®ion ); + vkCmdCopyImage( curCommandBuffer, compositeImage, VK_IMAGE_LAYOUT_GENERAL, pScreenshotTexture->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion ); } bool useForeignQueue = !BIsNested() && g_vulkanSupportsModifiers; @@ -2926,23 +2926,12 @@ std::shared_ptr vulkan_get_last_output_image( void ) return g_output.outputImage[ !g_output.nOutImage ]; } -uint32_t vulkan_texture_get_fbid( const std::shared_ptr& vulkanTex ) +int CVulkanTexture::memoryFence() { - if ( !vulkanTex ) - return 0; - - return vulkanTex->m_FBID; -} - -int vulkan_texture_get_fence( const std::shared_ptr& vulkanTex ) -{ - if ( !vulkanTex ) - return -1; - const VkMemoryGetFdInfoKHR memory_get_fd_info = { .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, .pNext = NULL, - .memory = vulkanTex->m_vkImageMemory, + .memory = m_vkImageMemory, .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, }; int fence = -1; @@ -3146,7 +3135,7 @@ std::shared_ptr vulkan_create_texture_from_wlr_buffer( struct wl .height = height, .depth = 1 }; - vkCmdCopyBufferToImage( commandBuffer, buffer, pTex->m_vkImage, VK_IMAGE_LAYOUT_GENERAL, 1, ®ion ); + vkCmdCopyBufferToImage( commandBuffer, buffer, pTex->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion ); std::vector> refs; refs.push_back( pTex ); diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index acc8b89..3957168 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -95,14 +95,26 @@ public: bool BInit( uint32_t width, uint32_t height, uint32_t drmFormat, createFlags flags, wlr_dmabuf_attributes *pDMA = nullptr ); - inline VkImageView getView( bool linear ) - { - return linear ? m_linearView : m_srgbView; - } + inline VkImageView view( bool linear ) { return linear ? m_linearView : m_srgbView; } + inline VkImageView linearView() { return m_linearView; } + inline VkImageView srgbView() { return m_srgbView; } + inline uint32_t width() { return m_width; } + inline uint32_t height() { return m_height; } + inline uint32_t rowPitch() { return m_unRowPitch; } + inline uint32_t fbid() { return m_FBID; } + inline void *mappedData() { return m_pMappedData; } + inline VkFormat format() { return m_format; } + inline const struct wlr_dmabuf_attributes& dmabuf() { return m_dmabuf; } + inline VkImage vkImage() { return m_vkImage; } + + int memoryFence(); CVulkanTexture( void ); ~CVulkanTexture( void ); - + + bool m_bTransitioned = false; + +private: bool m_bInitialized = false; VkImage m_vkImage = VK_NULL_HANDLE; @@ -121,8 +133,6 @@ public: VkFormat m_format = VK_FORMAT_UNDEFINED; struct wlr_dmabuf_attributes m_dmabuf = {}; - - bool m_bTransitioned = false; }; struct vec2_t @@ -158,8 +168,8 @@ struct FrameInfo_t bool blackBorder; bool linearFilter; - uint32_t integerWidth() const { return tex->m_width / scale.x; } - uint32_t integerHeight() const { return tex->m_height / scale.y; } + uint32_t integerWidth() const { return tex->width() / scale.x; } + uint32_t integerHeight() const { return tex->height() / scale.y; } } layers[ k_nMaxLayers ]; uint32_t borderMask() const { @@ -177,7 +187,7 @@ struct FrameInfo_t { if ( layers[ i ].tex ) { - if (layers[ i ].tex->m_format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM) + if (layers[ i ].tex->format() == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM) result |= 1 << i; } } @@ -200,9 +210,6 @@ std::shared_ptr vulkan_create_texture_from_dmabuf( struct wlr_dm std::shared_ptr vulkan_create_texture_from_bits( uint32_t width, uint32_t height, uint32_t drmFormat, CVulkanTexture::createFlags texCreateFlags, void *bits ); std::shared_ptr vulkan_create_texture_from_wlr_buffer( struct wlr_buffer *buf ); -uint32_t vulkan_texture_get_fbid( const std::shared_ptr& vulkanTex ); -int vulkan_texture_get_fence( const std::shared_ptr& vulkanTex ); - bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr pScreenshotTexture ); std::shared_ptr vulkan_get_last_output_image( void ); std::shared_ptr vulkan_acquire_screenshot_texture(bool exportable); diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 9605072..4dab756 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -1264,7 +1264,7 @@ void MouseCursor::paint(win *window, win *fit, struct FrameInfo_t *frameInfo) layer->zpos = g_zposCursor; // cursor, on top of both bottom layers layer->tex = m_texture; - layer->fbid = BIsNested() ? 0 : vulkan_texture_get_fbid(m_texture); + layer->fbid = BIsNested() ? 0 : m_texture->fbid(); layer->linearFilter = false; layer->blackBorder = false; @@ -1812,7 +1812,7 @@ paint_all() layer->imageHeight = g_nOutputHeight; layer->tex = vulkan_get_last_output_image(); - layer->fbid = layer->tex->m_FBID; + layer->fbid = layer->tex->fbid(); layer->linearFilter = false; @@ -1855,12 +1855,12 @@ paint_all() if ( takeScreenshot ) { assert( pCaptureTexture != nullptr ); - assert( pCaptureTexture->m_format == VK_FORMAT_B8G8R8A8_UNORM ); + assert( pCaptureTexture->format() == VK_FORMAT_B8G8R8A8_UNORM ); std::thread screenshotThread = std::thread([=] { pthread_setname_np( pthread_self(), "gamescope-scrsh" ); - const uint8_t *mappedData = reinterpret_cast(pCaptureTexture->m_pMappedData); + const uint8_t *mappedData = reinterpret_cast(pCaptureTexture->mappedData()); // Make our own copy of the image to remove the alpha channel. auto imageData = std::vector(currentOutputWidth * currentOutputHeight * 4); @@ -1871,9 +1871,9 @@ paint_all() for (uint32_t x = 0; x < currentOutputWidth; x++) { // BGR... - imageData[y * pitch + x * comp + 0] = mappedData[y * pCaptureTexture->m_unRowPitch + x * comp + 2]; - imageData[y * pitch + x * comp + 1] = mappedData[y * pCaptureTexture->m_unRowPitch + x * comp + 1]; - imageData[y * pitch + x * comp + 2] = mappedData[y * pCaptureTexture->m_unRowPitch + x * comp + 0]; + imageData[y * pitch + x * comp + 0] = mappedData[y * pCaptureTexture->rowPitch() + x * comp + 2]; + imageData[y * pitch + x * comp + 1] = mappedData[y * pCaptureTexture->rowPitch() + x * comp + 1]; + imageData[y * pitch + x * comp + 2] = mappedData[y * pCaptureTexture->rowPitch() + x * comp + 0]; imageData[y * pitch + x * comp + 3] = 255; } } @@ -4335,7 +4335,7 @@ void check_new_wayland_res(xwayland_ctx_t *ctx) } else { - fence = vulkan_texture_get_fence( newCommit->vulkanTex ); + fence = newCommit->vulkanTex->memoryFence(); } // Whether or not to nudge mango app when this commit is done.