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_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);

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;
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);

View file

@ -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<CVulkanTexture> 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, &region );
vkCmdCopyBufferToImage( commandBuffer, uploadBuffer, pTex->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, &region );
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_ptr<CVulkanTex
}
else
{
compositeImage = g_output.outputImage[ g_output.nOutImage ]->m_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_ptr<CVulkanTex
? VK_QUEUE_FAMILY_FOREIGN_EXT
: VK_QUEUE_FAMILY_EXTERNAL_KHR;
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;
}
@ -2622,21 +2622,21 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
struct FrameInfo_t fsrFrameInfo = *frameInfo;
fsrFrameInfo.layers[0].linearFilter = true;
uint32_t inputX = fsrFrameInfo.layers[0].tex->m_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_ptr<CVulkanTex
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = g_output.tmpOutput->m_vkImage,
.image = g_output.tmpOutput->vkImage(),
.subresourceRange = subResRange
};
@ -2704,7 +2704,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
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,
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));
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,
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,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = g_output.tmpOutput->m_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_ptr<CVulkanTex
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = pScreenshotTexture->m_vkImage,
.image = pScreenshotTexture->vkImage(),
.subresourceRange = subResRange
};
@ -2846,7 +2846,7 @@ bool vulkan_composite( struct FrameInfo_t *frameInfo, std::shared_ptr<CVulkanTex
.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;
@ -2926,23 +2926,12 @@ std::shared_ptr<CVulkanTexture> vulkan_get_last_output_image( void )
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 = {
.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<CVulkanTexture> vulkan_create_texture_from_wlr_buffer( struct wl
.height = height,
.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;
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 );
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<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_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 );
std::shared_ptr<CVulkanTexture> vulkan_get_last_output_image( void );
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->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<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.
auto imageData = std::vector<uint8_t>(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.