Stop accessing CVulkanTexture members directly.

This commit is contained in:
Georg Lehmann 2022-05-05 18:59:23 +02:00 committed by Joshie
parent d29d83f792
commit 2f111b0b98
5 changed files with 60 additions and 64 deletions

View file

@ -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_X", 0);
add_plane_property(req, drm->primary, "SRC_Y", 0); add_plane_property(req, drm->primary, "SRC_Y", 0);
const uint16_t srcWidth = frameInfo->layers[ 0 ].tex->m_width; const uint16_t srcWidth = frameInfo->layers[ 0 ].tex->width();
const uint16_t srcHeight = frameInfo->layers[ 0 ].tex->m_height; 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_W", srcWidth << 16);
add_plane_property(req, drm->primary, "SRC_H", srcHeight << 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 ], "zpos", frameInfo->layers[ i ].zpos );
liftoff_layer_set_property( drm->lo_layers[ i ], "alpha", frameInfo->layers[ i ].opacity * 0xffff); 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 srcWidth = frameInfo->layers[ i ].tex->width();
const uint16_t srcHeight = frameInfo->layers[ i ].tex->m_height; 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_X", 0);
liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_Y", 0); liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_Y", 0);

View file

@ -96,12 +96,12 @@ static void copy_buffer(struct pipewire_state *state, struct pipewire_buffer *bu
{ {
std::shared_ptr<CVulkanTexture> &tex = buffer->texture; std::shared_ptr<CVulkanTexture> &tex = buffer->texture;
assert(tex != nullptr); 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 pw_buffer *pw_buffer = buffer->buffer;
struct spa_buffer *spa_buffer = pw_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)); struct spa_meta_header *header = (struct spa_meta_header *) spa_buffer_find_meta_data(spa_buffer, SPA_META_Header, sizeof(*header));
if (header != nullptr) { if (header != nullptr) {
@ -123,13 +123,13 @@ static void copy_buffer(struct pipewire_state *state, struct pipewire_buffer *bu
if (!needs_reneg) { if (!needs_reneg) {
int bpp = 4; int bpp = 4;
for (uint32_t i = 0; i < tex->m_height; i++) { for (uint32_t i = 0; i < tex->height(); i++) {
memcpy(buffer->shm.data + i * buffer->shm.stride, (uint8_t *) tex->m_pMappedData + i * tex->m_unRowPitch, bpp * tex->m_width); memcpy(buffer->shm.data + i * buffer->shm.stride, (uint8_t *) tex->mappedData() + i * tex->rowPitch(), bpp * tex->width());
} }
} }
break; break;
case SPA_DATA_DmaBuf: case SPA_DATA_DmaBuf:
dmabuf = tex->m_dmabuf; dmabuf = tex->dmabuf();
assert(dmabuf.n_planes == 1); assert(dmabuf.n_planes == 1);
chunk->offset = dmabuf.offset[0]; chunk->offset = dmabuf.offset[0];
chunk->stride = dmabuf.stride[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); assert(buffer->texture != nullptr);
if (is_dmabuf) { 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); assert(dmabuf.n_planes == 1);
off_t size = lseek(dmabuf.fd[0], 0, SEEK_END); off_t size = lseek(dmabuf.fd[0], 0, SEEK_END);

View file

@ -2063,8 +2063,8 @@ bool vulkan_init( void )
static void update_tmp_images( uint32_t width, uint32_t height ) static void update_tmp_images( uint32_t width, uint32_t height )
{ {
if ( g_output.tmpOutput != nullptr if ( g_output.tmpOutput != nullptr
&& width == g_output.tmpOutput->m_width && width == g_output.tmpOutput->width()
&& height == g_output.tmpOutput->m_height ) && height == g_output.tmpOutput->height() )
{ {
return; return;
} }
@ -2248,14 +2248,14 @@ std::shared_ptr<CVulkanTexture> vulkan_create_texture_from_bits( uint32_t width,
.newLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = pTex->m_vkImage, .image = pTex->vkImage(),
.subresourceRange = subResRange .subresourceRange = subResRange
}; };
vkCmdPipelineBarrier( commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, vkCmdPipelineBarrier( commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier );
vkCmdCopyBufferToImage( commandBuffer, uploadBuffer, pTex->m_vkImage, VK_IMAGE_LAYOUT_GENERAL, 1, &region ); vkCmdCopyBufferToImage( commandBuffer, uploadBuffer, pTex->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, &region );
memoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; memoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
memoryBarrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_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; bool compositeLayer = i > 0;
VkImageView imageView = frameInfo->layers[i].tex VkImageView imageView = frameInfo->layers[i].tex
? frameInfo->layers[i].tex->getView(compositeLayer || !firstSrgb) ? frameInfo->layers[i].tex->view(compositeLayer || !firstSrgb)
: VK_NULL_HANDLE; : VK_NULL_HANDLE;
VulkanSamplerCacheKey_t samplerKey; VulkanSamplerCacheKey_t samplerKey;
@ -2492,8 +2492,8 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
} }
else else
{ {
compositeImage = g_output.outputImage[ g_output.nOutImage ]->m_vkImage; compositeImage = g_output.outputImage[ g_output.nOutImage ]->vkImage();
targetImageView = g_output.outputImage[ g_output.nOutImage ]->m_srgbView; targetImageView = g_output.outputImage[ g_output.nOutImage ]->srgbView();
} }
VkCommandBuffer curCommandBuffer = g_output.commandBuffers[ g_output.nCurCmdBuffer ]; VkCommandBuffer curCommandBuffer = g_output.commandBuffers[ g_output.nCurCmdBuffer ];
@ -2562,7 +2562,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
? VK_QUEUE_FAMILY_FOREIGN_EXT ? VK_QUEUE_FAMILY_FOREIGN_EXT
: VK_QUEUE_FAMILY_EXTERNAL_KHR; : VK_QUEUE_FAMILY_EXTERNAL_KHR;
textureBarriers[i].dstQueueFamilyIndex = queueFamilyIndex; textureBarriers[i].dstQueueFamilyIndex = queueFamilyIndex;
textureBarriers[i].image = frameInfo->layers[i].tex->m_vkImage; textureBarriers[i].image = frameInfo->layers[i].tex->vkImage();
textureBarriers[i].subresourceRange = subResRange; textureBarriers[i].subresourceRange = subResRange;
} }
@ -2622,21 +2622,21 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
struct FrameInfo_t fsrFrameInfo = *frameInfo; struct FrameInfo_t fsrFrameInfo = *frameInfo;
fsrFrameInfo.layers[0].linearFilter = true; fsrFrameInfo.layers[0].linearFilter = true;
uint32_t inputX = fsrFrameInfo.layers[0].tex->m_width; uint32_t inputX = fsrFrameInfo.layers[0].tex->width();
uint32_t inputY = fsrFrameInfo.layers[0].tex->m_height; uint32_t inputY = fsrFrameInfo.layers[0].tex->height();
uint32_t tempX = fsrFrameInfo.layers[0].integerWidth(); uint32_t tempX = fsrFrameInfo.layers[0].integerWidth();
uint32_t tempY = fsrFrameInfo.layers[0].integerHeight(); uint32_t tempY = fsrFrameInfo.layers[0].integerHeight();
update_tmp_images(tempX, tempY); 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, vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier );
vkCmdBindPipeline(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, easuPipeline); 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); 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_ptr<CVulkanTex
.newLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = g_output.tmpOutput->m_vkImage, .image = g_output.tmpOutput->vkImage(),
.subresourceRange = subResRange .subresourceRange = subResRange
}; };
@ -2704,7 +2704,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
update_tmp_images(currentOutputWidth, currentOutputHeight); update_tmp_images(currentOutputWidth, currentOutputHeight);
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, vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier );
@ -2717,7 +2717,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
vkCmdBindPipeline(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, get_vk_pipeline(blur_layer_count, blurFrameInfo.ycbcrMask() & 0x1u, blurFrameInfo.blurRadius, type)); vkCmdBindPipeline(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, get_vk_pipeline(blur_layer_count, blurFrameInfo.ycbcrMask() & 0x1u, blurFrameInfo.blurRadius, type));
VkDescriptorSet descriptorSet = vulkan_update_descriptor( &blurFrameInfo, false, false, g_output.tmpOutput->m_srgbView ); VkDescriptorSet descriptorSet = vulkan_update_descriptor( &blurFrameInfo, false, false, g_output.tmpOutput->srgbView() );
vkCmdBindDescriptorSets(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, vkCmdBindDescriptorSets(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE,
pipelineLayout, 0, 1, &descriptorSet, 0, 0); pipelineLayout, 0, 1, &descriptorSet, 0, 0);
@ -2740,14 +2740,14 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
.newLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = g_output.tmpOutput->m_vkImage, .image = g_output.tmpOutput->vkImage(),
.subresourceRange = subResRange .subresourceRange = subResRange
}; };
vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); 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); 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_ptr<CVulkanTex
.newLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = pScreenshotTexture->m_vkImage, .image = pScreenshotTexture->vkImage(),
.subresourceRange = subResRange .subresourceRange = subResRange
}; };
@ -2846,7 +2846,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
.depth = 1 .depth = 1
}; };
vkCmdCopyImage( curCommandBuffer, compositeImage, VK_IMAGE_LAYOUT_GENERAL, pScreenshotTexture->m_vkImage, VK_IMAGE_LAYOUT_GENERAL, 1, &region ); vkCmdCopyImage( curCommandBuffer, compositeImage, VK_IMAGE_LAYOUT_GENERAL, pScreenshotTexture->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, &region );
} }
bool useForeignQueue = !BIsNested() && g_vulkanSupportsModifiers; bool useForeignQueue = !BIsNested() && g_vulkanSupportsModifiers;
@ -2926,23 +2926,12 @@ std::shared_ptr<CVulkanTexture> vulkan_get_last_output_image( void )
return g_output.outputImage[ !g_output.nOutImage ]; return g_output.outputImage[ !g_output.nOutImage ];
} }
uint32_t vulkan_texture_get_fbid( const std::shared_ptr<CVulkanTexture>& vulkanTex ) int CVulkanTexture::memoryFence()
{ {
if ( !vulkanTex )
return 0;
return vulkanTex->m_FBID;
}
int vulkan_texture_get_fence( const std::shared_ptr<CVulkanTexture>& vulkanTex )
{
if ( !vulkanTex )
return -1;
const VkMemoryGetFdInfoKHR memory_get_fd_info = { const VkMemoryGetFdInfoKHR memory_get_fd_info = {
.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
.pNext = NULL, .pNext = NULL,
.memory = vulkanTex->m_vkImageMemory, .memory = m_vkImageMemory,
.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
}; };
int fence = -1; int fence = -1;
@ -3146,7 +3135,7 @@ std::shared_ptr<CVulkanTexture> vulkan_create_texture_from_wlr_buffer( struct wl
.height = height, .height = height,
.depth = 1 .depth = 1
}; };
vkCmdCopyBufferToImage( commandBuffer, buffer, pTex->m_vkImage, VK_IMAGE_LAYOUT_GENERAL, 1, &region ); vkCmdCopyBufferToImage( commandBuffer, buffer, pTex->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, &region );
std::vector<std::shared_ptr<CVulkanTexture>> refs; std::vector<std::shared_ptr<CVulkanTexture>> refs;
refs.push_back( pTex ); refs.push_back( pTex );

View file

@ -95,14 +95,26 @@ public:
bool BInit( uint32_t width, uint32_t height, uint32_t drmFormat, createFlags flags, wlr_dmabuf_attributes *pDMA = nullptr ); bool BInit( uint32_t width, uint32_t height, uint32_t drmFormat, createFlags flags, wlr_dmabuf_attributes *pDMA = nullptr );
inline VkImageView getView( bool linear ) inline VkImageView view( bool linear ) { return linear ? m_linearView : m_srgbView; }
{ inline VkImageView linearView() { return m_linearView; }
return linear ? m_linearView : m_srgbView; 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 );
~CVulkanTexture( void ); ~CVulkanTexture( void );
bool m_bTransitioned = false;
private:
bool m_bInitialized = false; bool m_bInitialized = false;
VkImage m_vkImage = VK_NULL_HANDLE; VkImage m_vkImage = VK_NULL_HANDLE;
@ -121,8 +133,6 @@ public:
VkFormat m_format = VK_FORMAT_UNDEFINED; VkFormat m_format = VK_FORMAT_UNDEFINED;
struct wlr_dmabuf_attributes m_dmabuf = {}; struct wlr_dmabuf_attributes m_dmabuf = {};
bool m_bTransitioned = false;
}; };
struct vec2_t struct vec2_t
@ -158,8 +168,8 @@ struct FrameInfo_t
bool blackBorder; bool blackBorder;
bool linearFilter; bool linearFilter;
uint32_t integerWidth() const { return tex->m_width / scale.x; } uint32_t integerWidth() const { return tex->width() / scale.x; }
uint32_t integerHeight() const { return tex->m_height / scale.y; } uint32_t integerHeight() const { return tex->height() / scale.y; }
} layers[ k_nMaxLayers ]; } layers[ k_nMaxLayers ];
uint32_t borderMask() const { uint32_t borderMask() const {
@ -177,7 +187,7 @@ struct FrameInfo_t
{ {
if ( layers[ i ].tex ) 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; result |= 1 << i;
} }
} }
@ -200,9 +210,6 @@ std::shared_ptr<CVulkanTexture> vulkan_create_texture_from_dmabuf( struct wlr_dm
std::shared_ptr<CVulkanTexture> vulkan_create_texture_from_bits( uint32_t width, uint32_t height, uint32_t drmFormat, CVulkanTexture::createFlags texCreateFlags, void *bits ); std::shared_ptr<CVulkanTexture> vulkan_create_texture_from_bits( uint32_t width, uint32_t height, uint32_t drmFormat, CVulkanTexture::createFlags texCreateFlags, void *bits );
std::shared_ptr<CVulkanTexture> vulkan_create_texture_from_wlr_buffer( struct wlr_buffer *buf ); std::shared_ptr<CVulkanTexture> vulkan_create_texture_from_wlr_buffer( struct wlr_buffer *buf );
uint32_t vulkan_texture_get_fbid( const std::shared_ptr<CVulkanTexture>& vulkanTex );
int vulkan_texture_get_fence( const std::shared_ptr<CVulkanTexture>& vulkanTex );
bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTexture> pScreenshotTexture ); bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTexture> pScreenshotTexture );
std::shared_ptr<CVulkanTexture> vulkan_get_last_output_image( void ); std::shared_ptr<CVulkanTexture> vulkan_get_last_output_image( void );
std::shared_ptr<CVulkanTexture> vulkan_acquire_screenshot_texture(bool exportable); std::shared_ptr<CVulkanTexture> vulkan_acquire_screenshot_texture(bool exportable);

View file

@ -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->zpos = g_zposCursor; // cursor, on top of both bottom layers
layer->tex = m_texture; 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->linearFilter = false;
layer->blackBorder = false; layer->blackBorder = false;
@ -1812,7 +1812,7 @@ paint_all()
layer->imageHeight = g_nOutputHeight; layer->imageHeight = g_nOutputHeight;
layer->tex = vulkan_get_last_output_image(); layer->tex = vulkan_get_last_output_image();
layer->fbid = layer->tex->m_FBID; layer->fbid = layer->tex->fbid();
layer->linearFilter = false; layer->linearFilter = false;
@ -1855,12 +1855,12 @@ paint_all()
if ( takeScreenshot ) if ( takeScreenshot )
{ {
assert( pCaptureTexture != nullptr ); assert( pCaptureTexture != nullptr );
assert( pCaptureTexture->m_format == VK_FORMAT_B8G8R8A8_UNORM ); assert( pCaptureTexture->format() == VK_FORMAT_B8G8R8A8_UNORM );
std::thread screenshotThread = std::thread([=] { std::thread screenshotThread = std::thread([=] {
pthread_setname_np( pthread_self(), "gamescope-scrsh" ); pthread_setname_np( pthread_self(), "gamescope-scrsh" );
const uint8_t *mappedData = reinterpret_cast<const uint8_t *>(pCaptureTexture->m_pMappedData); const uint8_t *mappedData = reinterpret_cast<const uint8_t *>(pCaptureTexture->mappedData());
// Make our own copy of the image to remove the alpha channel. // Make our own copy of the image to remove the alpha channel.
auto imageData = std::vector<uint8_t>(currentOutputWidth * currentOutputHeight * 4); auto imageData = std::vector<uint8_t>(currentOutputWidth * currentOutputHeight * 4);
@ -1871,9 +1871,9 @@ paint_all()
for (uint32_t x = 0; x < currentOutputWidth; x++) for (uint32_t x = 0; x < currentOutputWidth; x++)
{ {
// BGR... // BGR...
imageData[y * pitch + x * comp + 0] = mappedData[y * pCaptureTexture->m_unRowPitch + x * comp + 2]; imageData[y * pitch + x * comp + 0] = mappedData[y * pCaptureTexture->rowPitch() + x * comp + 2];
imageData[y * pitch + x * comp + 1] = mappedData[y * pCaptureTexture->m_unRowPitch + x * comp + 1]; imageData[y * pitch + x * comp + 1] = mappedData[y * pCaptureTexture->rowPitch() + x * comp + 1];
imageData[y * pitch + x * comp + 2] = mappedData[y * pCaptureTexture->m_unRowPitch + x * comp + 0]; imageData[y * pitch + x * comp + 2] = mappedData[y * pCaptureTexture->rowPitch() + x * comp + 0];
imageData[y * pitch + x * comp + 3] = 255; imageData[y * pitch + x * comp + 3] = 255;
} }
} }
@ -4335,7 +4335,7 @@ void check_new_wayland_res(xwayland_ctx_t *ctx)
} }
else else
{ {
fence = vulkan_texture_get_fence( newCommit->vulkanTex ); fence = newCommit->vulkanTex->memoryFence();
} }
// Whether or not to nudge mango app when this commit is done. // Whether or not to nudge mango app when this commit is done.