1b8e80941Smrg/* 2b8e80941Smrg * Copyright © 2019 Intel Corporation 3b8e80941Smrg * 4b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5b8e80941Smrg * copy of this software and associated documentation files (the "Software"), 6b8e80941Smrg * to deal in the Software without restriction, including without limitation 7b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the 9b8e80941Smrg * Software is furnished to do so, subject to the following conditions: 10b8e80941Smrg * 11b8e80941Smrg * The above copyright notice and this permission notice (including the next 12b8e80941Smrg * paragraph) shall be included in all copies or substantial portions of the 13b8e80941Smrg * Software. 14b8e80941Smrg * 15b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b8e80941Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19b8e80941Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20b8e80941Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21b8e80941Smrg * IN THE SOFTWARE. 22b8e80941Smrg */ 23b8e80941Smrg 24b8e80941Smrg#include <stdio.h> 25b8e80941Smrg#include <string.h> 26b8e80941Smrg#include <stdlib.h> 27b8e80941Smrg 28b8e80941Smrg#include "overlay_params.h" 29b8e80941Smrg 30b8e80941Smrgstatic enum overlay_param_position 31b8e80941Smrgparse_position(const char *str) 32b8e80941Smrg{ 33b8e80941Smrg if (!str || !strcmp(str, "top-left")) 34b8e80941Smrg return LAYER_POSITION_TOP_LEFT; 35b8e80941Smrg if (!strcmp(str, "top-right")) 36b8e80941Smrg return LAYER_POSITION_TOP_RIGHT; 37b8e80941Smrg if (!strcmp(str, "bottom-left")) 38b8e80941Smrg return LAYER_POSITION_BOTTOM_LEFT; 39b8e80941Smrg if (!strcmp(str, "bottom-right")) 40b8e80941Smrg return LAYER_POSITION_BOTTOM_RIGHT; 41b8e80941Smrg return LAYER_POSITION_TOP_LEFT; 42b8e80941Smrg} 43b8e80941Smrg 44b8e80941Smrgstatic FILE * 45b8e80941Smrgparse_output_file(const char *str) 46b8e80941Smrg{ 47b8e80941Smrg return fopen(str, "w+"); 48b8e80941Smrg} 49b8e80941Smrg 50b8e80941Smrgstatic uint32_t 51b8e80941Smrgparse_fps_sampling_period(const char *str) 52b8e80941Smrg{ 53b8e80941Smrg return strtol(str, NULL, 0) * 1000; 54b8e80941Smrg} 55b8e80941Smrg 56b8e80941Smrgstatic bool 57b8e80941Smrgparse_no_display(const char *str) 58b8e80941Smrg{ 59b8e80941Smrg return strtol(str, NULL, 0) != 0; 60b8e80941Smrg} 61b8e80941Smrg 62b8e80941Smrgstatic unsigned 63b8e80941Smrgparse_unsigned(const char *str) 64b8e80941Smrg{ 65b8e80941Smrg return strtol(str, NULL, 0); 66b8e80941Smrg} 67b8e80941Smrg 68b8e80941Smrg#define parse_width(s) parse_unsigned(s) 69b8e80941Smrg#define parse_height(s) parse_unsigned(s) 70b8e80941Smrg 71b8e80941Smrgstatic bool 72b8e80941Smrgparse_help(const char *str) 73b8e80941Smrg{ 74b8e80941Smrg fprintf(stderr, "Layer params using VK_LAYER_MESA_OVERLAY_CONFIG=\n"); 75b8e80941Smrg#define OVERLAY_PARAM_BOOL(name) \ 76b8e80941Smrg fprintf(stderr, "\t%s=0|1\n", #name); 77b8e80941Smrg#define OVERLAY_PARAM_CUSTOM(name) 78b8e80941Smrg OVERLAY_PARAMS 79b8e80941Smrg#undef OVERLAY_PARAM_BOOL 80b8e80941Smrg#undef OVERLAY_PARAM_CUSTOM 81b8e80941Smrg fprintf(stderr, "\tposition=top-left|top-right|bottom-left|bottom-right\n"); 82b8e80941Smrg fprintf(stderr, "\tfps_sampling_period=number-of-milliseconds\n"); 83b8e80941Smrg fprintf(stderr, "\tno_display=0|1\n"); 84b8e80941Smrg fprintf(stderr, "\toutput_file=/path/to/output.txt\n"); 85b8e80941Smrg fprintf(stderr, "\twidth=width-in-pixels\n"); 86b8e80941Smrg fprintf(stderr, "\theight=height-in-pixels\n"); 87b8e80941Smrg 88b8e80941Smrg return true; 89b8e80941Smrg} 90b8e80941Smrg 91b8e80941Smrgstatic bool is_delimiter(char c) 92b8e80941Smrg{ 93b8e80941Smrg return c == 0 || c == ',' || c == ':' || c == ';' || c == '='; 94b8e80941Smrg} 95b8e80941Smrg 96b8e80941Smrgstatic int 97b8e80941Smrgparse_string(const char *s, char *out_param, char *out_value) 98b8e80941Smrg{ 99b8e80941Smrg int i = 0; 100b8e80941Smrg 101b8e80941Smrg for (; !is_delimiter(*s); s++, out_param++, i++) 102b8e80941Smrg *out_param = *s; 103b8e80941Smrg 104b8e80941Smrg *out_param = 0; 105b8e80941Smrg 106b8e80941Smrg if (*s == '=') { 107b8e80941Smrg s++; 108b8e80941Smrg i++; 109b8e80941Smrg for (; !is_delimiter(*s); s++, out_value++, i++) 110b8e80941Smrg *out_value = *s; 111b8e80941Smrg } else 112b8e80941Smrg *(out_value++) = '1'; 113b8e80941Smrg *out_value = 0; 114b8e80941Smrg 115b8e80941Smrg if (*s && is_delimiter(*s)) { 116b8e80941Smrg s++; 117b8e80941Smrg i++; 118b8e80941Smrg } 119b8e80941Smrg 120b8e80941Smrg if (*s && !i) { 121b8e80941Smrg fprintf(stderr, "mesa-overlay: syntax error: unexpected '%c' (%i) while " 122b8e80941Smrg "parsing a string\n", *s, *s); 123b8e80941Smrg fflush(stderr); 124b8e80941Smrg } 125b8e80941Smrg 126b8e80941Smrg return i; 127b8e80941Smrg} 128b8e80941Smrg 129b8e80941Smrgconst char *overlay_param_names[] = { 130b8e80941Smrg#define OVERLAY_PARAM_BOOL(name) #name, 131b8e80941Smrg#define OVERLAY_PARAM_CUSTOM(name) 132b8e80941Smrg OVERLAY_PARAMS 133b8e80941Smrg#undef OVERLAY_PARAM_BOOL 134b8e80941Smrg#undef OVERLAY_PARAM_CUSTOM 135b8e80941Smrg}; 136b8e80941Smrg 137b8e80941Smrgvoid 138b8e80941Smrgparse_overlay_env(struct overlay_params *params, 139b8e80941Smrg const char *env) 140b8e80941Smrg{ 141b8e80941Smrg uint32_t num; 142b8e80941Smrg char key[256], value[256]; 143b8e80941Smrg 144b8e80941Smrg memset(params, 0, sizeof(*params)); 145b8e80941Smrg 146b8e80941Smrg /* Visible by default */ 147b8e80941Smrg params->enabled[OVERLAY_PARAM_ENABLED_fps] = true; 148b8e80941Smrg params->enabled[OVERLAY_PARAM_ENABLED_frame_timing] = true; 149b8e80941Smrg params->fps_sampling_period = 500000; /* 500ms */ 150b8e80941Smrg params->width = params->height = 300; 151b8e80941Smrg 152b8e80941Smrg if (!env) 153b8e80941Smrg return; 154b8e80941Smrg 155b8e80941Smrg while ((num = parse_string(env, key, value)) != 0) { 156b8e80941Smrg env += num; 157b8e80941Smrg 158b8e80941Smrg#define OVERLAY_PARAM_BOOL(name) \ 159b8e80941Smrg if (!strcmp(#name, key)) { \ 160b8e80941Smrg params->enabled[OVERLAY_PARAM_ENABLED_##name] = \ 161b8e80941Smrg strtol(value, NULL, 0); \ 162b8e80941Smrg continue; \ 163b8e80941Smrg } 164b8e80941Smrg#define OVERLAY_PARAM_CUSTOM(name) \ 165b8e80941Smrg if (!strcmp(#name, key)) { \ 166b8e80941Smrg params->name = parse_##name(value); \ 167b8e80941Smrg continue; \ 168b8e80941Smrg } 169b8e80941Smrg OVERLAY_PARAMS 170b8e80941Smrg#undef OVERLAY_PARAM_BOOL 171b8e80941Smrg#undef OVERLAY_PARAM_CUSTOM 172b8e80941Smrg fprintf(stderr, "Unknown option '%s'\n", key); 173b8e80941Smrg } 174b8e80941Smrg} 175