1/************************************************************************** 2 * 3 * Copyright 2018-2019 Alyssa Rosenzweig 4 * Copyright 2018-2019 Collabora, Ltd. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29#ifndef PAN_SCREEN_H 30#define PAN_SCREEN_H 31 32#include <xf86drm.h> 33#include "pipe/p_screen.h" 34#include "pipe/p_defines.h" 35#include "renderonly/renderonly.h" 36#include "util/u_dynarray.h" 37#include "util/bitset.h" 38#include "util/set.h" 39#include "util/log.h" 40 41#include "pan_device.h" 42#include "pan_mempool.h" 43 44struct panfrost_batch; 45struct panfrost_context; 46struct panfrost_resource; 47struct panfrost_shader_state; 48struct pan_fb_info; 49struct pan_blend_state; 50 51/* Virtual table of per-generation (GenXML) functions */ 52 53struct panfrost_vtable { 54 /* Prepares the renderer state descriptor or shader program descriptor 55 * for a given compiled shader, and if desired uploads it as well */ 56 void (*prepare_shader)(struct panfrost_shader_state *, 57 struct panfrost_pool *, bool); 58 59 /* Emits a thread local storage descriptor */ 60 void (*emit_tls)(struct panfrost_batch *); 61 62 /* Emits a framebuffer descriptor */ 63 void (*emit_fbd)(struct panfrost_batch *, const struct pan_fb_info *); 64 65 /* Emits a fragment job */ 66 mali_ptr (*emit_fragment_job)(struct panfrost_batch *, const struct pan_fb_info *); 67 68 /* General destructor */ 69 void (*screen_destroy)(struct pipe_screen *); 70 71 /* Preload framebuffer */ 72 void (*preload)(struct panfrost_batch *, struct pan_fb_info *); 73 74 /* Initialize a Gallium context */ 75 void (*context_init)(struct pipe_context *pipe); 76 77 /* Device-dependent initialization of a panfrost_batch */ 78 void (*init_batch)(struct panfrost_batch *batch); 79 80 /* Get blend shader */ 81 struct pan_blend_shader_variant * 82 (*get_blend_shader)(const struct panfrost_device *, 83 const struct pan_blend_state *, 84 nir_alu_type, nir_alu_type, 85 unsigned rt); 86 87 /* Initialize the polygon list */ 88 void (*init_polygon_list)(struct panfrost_batch *); 89 90 /* Shader compilation methods */ 91 const nir_shader_compiler_options *(*get_compiler_options)(void); 92 void (*compile_shader)(nir_shader *s, 93 struct panfrost_compile_inputs *inputs, 94 struct util_dynarray *binary, 95 struct pan_shader_info *info); 96}; 97 98struct panfrost_screen { 99 struct pipe_screen base; 100 struct panfrost_device dev; 101 struct { 102 struct panfrost_pool bin_pool; 103 struct panfrost_pool desc_pool; 104 } blitter; 105 struct { 106 struct panfrost_pool bin_pool; 107 } indirect_draw; 108 109 struct panfrost_vtable vtbl; 110}; 111 112static inline struct panfrost_screen * 113pan_screen(struct pipe_screen *p) 114{ 115 return (struct panfrost_screen *)p; 116} 117 118static inline struct panfrost_device * 119pan_device(struct pipe_screen *p) 120{ 121 return &(pan_screen(p)->dev); 122} 123 124struct pipe_fence_handle * 125panfrost_fence_create(struct panfrost_context *ctx); 126 127void panfrost_cmdstream_screen_init_v4(struct panfrost_screen *screen); 128void panfrost_cmdstream_screen_init_v5(struct panfrost_screen *screen); 129void panfrost_cmdstream_screen_init_v6(struct panfrost_screen *screen); 130void panfrost_cmdstream_screen_init_v7(struct panfrost_screen *screen); 131void panfrost_cmdstream_screen_init_v9(struct panfrost_screen *screen); 132 133#define perf_debug(dev, ...) \ 134 do { \ 135 if (unlikely((dev)->debug & PAN_DBG_PERF)) \ 136 mesa_logw(__VA_ARGS__); \ 137 } while(0) 138 139#define perf_debug_ctx(ctx, ...) \ 140 perf_debug(pan_device((ctx)->base.screen), __VA_ARGS__); 141 142#endif /* PAN_SCREEN_H */ 143