mesa/src/vulkan/screenshot-layer/screenshot_params.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

99 lines
2.9 KiB
C
Raw Normal View History

vulkan/screenshot-layer: Add Vulkan screenshot layer This change adds a Vulkan screenshot layer that allows users to take screenshots from a Vulkan application, but has an emphasis on performance, decreasing the performance impact on the application involved. This allows for automated setups to use this layer to take screenshots for navigating various in-application menus. This layer works by hooking into various common Vulkan setup functions, until it enters the vkQueuePresentKHR function, and from there it copies the current frame's image from the swapchain as an RGB image to host-cached memory, where we will receive the information as a framebuffer pointer. From there, we copy the framebuffer contents to a thread that will detach from the main process so it can write the image to a PNG file without holding back the main thread. This layer was created from using the existing overlay layer as a template, then adding portions of LunarG's VulkanTools screenshot layer: https://github.com/LunarG/VulkanTools/blob/main/layersvt/screenshot.cpp More specifically, there were usages of functions, along with modifications of various functions from screenshot.cpp in the VulkanTools project, used in screenshot.cpp. There are some sections of the screenshotting functionality that remain unmodified from the original screenshot.cpp file in VulkanTools, including the global locking structures and the writeFile() function, which takes care of obtaining the images from the swapchain. There were various areas in which modifications were made, including how images are written to a file (using PNG instead of PPM, introducing threading, added fences/semaphores, etc), along with many smaller changes. v2: Fix segfault upon application exit v3: Fix filename issue with concatenation, along with some leftover memory handling that wasn't cleaned up. v4: Fix some error handling and nits v5: Fix output directory handling Reviewed-by: Ivan Briano <ivan.briano@intel.com Signed-off-by: Casey Bowman <casey.g.bowman@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30527>
2024-05-29 23:39:45 -07:00
/*
* Copyright © 2024 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef SCREENSHOT_PARAMS_H
#define SCREENSHOT_PARAMS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#define SCREENSHOT_PARAMS \
SCREENSHOT_PARAM_BOOL(comms) \
SCREENSHOT_PARAM_CUSTOM(control) \
SCREENSHOT_PARAM_CUSTOM(frames) \
SCREENSHOT_PARAM_CUSTOM(log_type) \
SCREENSHOT_PARAM_CUSTOM(output_dir) \
SCREENSHOT_PARAM_CUSTOM(help)
enum screenshot_param_enabled {
#define SCREENSHOT_PARAM_BOOL(name) SCREENSHOT_PARAM_ENABLED_##name,
#define SCREENSHOT_PARAM_CUSTOM(name)
SCREENSHOT_PARAMS
#undef SCREENSHOT_PARAM_BOOL
#undef SCREENSHOT_PARAM_CUSTOM
SCREENSHOT_PARAM_ENABLED_MAX
};
enum LogType {
DEBUG,
ERROR,
INFO,
NO_PREFIX, // Don't prefix the log with text
REQUIRED, // Non-error logs that must be printed for user
WARN
};
extern enum LogType LOG_TYPE;
struct frame_node {
uint32_t frame_num;
struct frame_node *next;
};
/* List should be sorted into ascending order, in terms of frame_node data */
struct frame_list {
uint32_t size;
bool all_frames;
struct frame_node *head;
};
void remove_node(struct frame_list *, struct frame_node *, struct frame_node *);
void destroy_frame_list(struct frame_list *);
void LOG(enum LogType, const char *, ...);
struct screenshot_params {
bool enabled[SCREENSHOT_PARAM_ENABLED_MAX];
struct frame_list *frames;
const char *control;
enum LogType log_type;
const char *output_dir;
bool help;
};
const extern char *screenshot_param_names[];
void parse_screenshot_env(struct screenshot_params *params,
const char *env);
#ifdef __cplusplus
}
#endif
#endif /* SCREENSHOT_PARAMS_H */