1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright (C) 2016 Christian Gmeiner <[email protected]>
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker *
23*61046927SAndroid Build Coastguard Worker * Authors:
24*61046927SAndroid Build Coastguard Worker * Christian Gmeiner <[email protected]>
25*61046927SAndroid Build Coastguard Worker */
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker #ifndef RENDERONLY_H
28*61046927SAndroid Build Coastguard Worker #define RENDERONLY_H
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker #include <stdint.h>
31*61046927SAndroid Build Coastguard Worker #include "frontend/drm_driver.h"
32*61046927SAndroid Build Coastguard Worker #include "pipe/p_state.h"
33*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
34*61046927SAndroid Build Coastguard Worker #include "util/sparse_array.h"
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker struct renderonly_scanout {
37*61046927SAndroid Build Coastguard Worker uint32_t handle;
38*61046927SAndroid Build Coastguard Worker uint32_t stride;
39*61046927SAndroid Build Coastguard Worker int32_t refcnt;
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker struct renderonly {
43*61046927SAndroid Build Coastguard Worker /**
44*61046927SAndroid Build Coastguard Worker * Create a renderonly_scanout object for scanout resource.
45*61046927SAndroid Build Coastguard Worker *
46*61046927SAndroid Build Coastguard Worker * This function creates a renderonly_scanout object based on the provided
47*61046927SAndroid Build Coastguard Worker * resource. The library is designed that the driver specific pipe_resource
48*61046927SAndroid Build Coastguard Worker * struct holds a pointer to a renderonly_scanout struct.
49*61046927SAndroid Build Coastguard Worker *
50*61046927SAndroid Build Coastguard Worker * struct driver_resource {
51*61046927SAndroid Build Coastguard Worker * struct pipe_resource base;
52*61046927SAndroid Build Coastguard Worker * struct renderonly_scanout *scanout;
53*61046927SAndroid Build Coastguard Worker * ...
54*61046927SAndroid Build Coastguard Worker * };
55*61046927SAndroid Build Coastguard Worker *
56*61046927SAndroid Build Coastguard Worker * The renderonly_scanout object exits for two reasons:
57*61046927SAndroid Build Coastguard Worker * - Do any special treatment for a scanout resource like importing the GPU
58*61046927SAndroid Build Coastguard Worker * resource into the scanout hw.
59*61046927SAndroid Build Coastguard Worker * - Make it easier for a gallium driver to detect if anything special needs
60*61046927SAndroid Build Coastguard Worker * to be done in flush_resource(..) like a resolve to linear.
61*61046927SAndroid Build Coastguard Worker *
62*61046927SAndroid Build Coastguard Worker * When the screen has renderonly enabled, drivers need to follow these
63*61046927SAndroid Build Coastguard Worker * rules:
64*61046927SAndroid Build Coastguard Worker * - Create the scanout resource in resource_create and
65*61046927SAndroid Build Coastguard Worker * resource_create_with_modifiers if PIPE_BIND_SCANOUT is set. Drivers
66*61046927SAndroid Build Coastguard Worker * can fail if the scanout resource couldn't be created.
67*61046927SAndroid Build Coastguard Worker * - Try to import the scanout resource in resource_from_handle with
68*61046927SAndroid Build Coastguard Worker * renderonly_create_gpu_import_for_resource. Drivers MUST NOT fail if
69*61046927SAndroid Build Coastguard Worker * the scanout resource couldn't be created.
70*61046927SAndroid Build Coastguard Worker * - In a resource_get_handle call for WINSYS_HANDLE_TYPE_KMS, use
71*61046927SAndroid Build Coastguard Worker * renderonly_get_handle with the scanout resource, even if the scanout
72*61046927SAndroid Build Coastguard Worker * resource is NULL. Drivers MUST NOT return their own resource here,
73*61046927SAndroid Build Coastguard Worker * because the GEM handle will not be valid for the caller's DRM FD.
74*61046927SAndroid Build Coastguard Worker * - Implement resource_get_params for at least PIPE_RESOURCE_PARAM_STRIDE,
75*61046927SAndroid Build Coastguard Worker * PIPE_RESOURCE_PARAM_OFFSET and PIPE_RESOURCE_PARAM_MODIFIER.
76*61046927SAndroid Build Coastguard Worker */
77*61046927SAndroid Build Coastguard Worker struct renderonly_scanout *(*create_for_resource)(struct pipe_resource *rsc,
78*61046927SAndroid Build Coastguard Worker struct renderonly *ro,
79*61046927SAndroid Build Coastguard Worker struct winsys_handle *out_handle);
80*61046927SAndroid Build Coastguard Worker void (*destroy)(struct renderonly *ro);
81*61046927SAndroid Build Coastguard Worker int kms_fd;
82*61046927SAndroid Build Coastguard Worker int gpu_fd;
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker simple_mtx_t bo_map_lock;
85*61046927SAndroid Build Coastguard Worker struct util_sparse_array bo_map;
86*61046927SAndroid Build Coastguard Worker };
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker static inline struct renderonly_scanout *
renderonly_scanout_for_resource(struct pipe_resource * rsc,struct renderonly * ro,struct winsys_handle * out_handle)89*61046927SAndroid Build Coastguard Worker renderonly_scanout_for_resource(struct pipe_resource *rsc,
90*61046927SAndroid Build Coastguard Worker struct renderonly *ro,
91*61046927SAndroid Build Coastguard Worker struct winsys_handle *out_handle)
92*61046927SAndroid Build Coastguard Worker {
93*61046927SAndroid Build Coastguard Worker return ro->create_for_resource(rsc, ro, out_handle);
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker void
97*61046927SAndroid Build Coastguard Worker renderonly_scanout_destroy(struct renderonly_scanout *scanout,
98*61046927SAndroid Build Coastguard Worker struct renderonly *ro);
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker static inline bool
renderonly_get_handle(struct renderonly_scanout * scanout,struct winsys_handle * handle)101*61046927SAndroid Build Coastguard Worker renderonly_get_handle(struct renderonly_scanout *scanout,
102*61046927SAndroid Build Coastguard Worker struct winsys_handle *handle)
103*61046927SAndroid Build Coastguard Worker {
104*61046927SAndroid Build Coastguard Worker if (!scanout)
105*61046927SAndroid Build Coastguard Worker return false;
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker assert(handle->type == WINSYS_HANDLE_TYPE_KMS);
108*61046927SAndroid Build Coastguard Worker handle->handle = scanout->handle;
109*61046927SAndroid Build Coastguard Worker handle->stride = scanout->stride;
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker return true;
112*61046927SAndroid Build Coastguard Worker }
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker /**
115*61046927SAndroid Build Coastguard Worker * Create a dumb buffer object for a resource at scanout hw.
116*61046927SAndroid Build Coastguard Worker */
117*61046927SAndroid Build Coastguard Worker struct renderonly_scanout *
118*61046927SAndroid Build Coastguard Worker renderonly_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc,
119*61046927SAndroid Build Coastguard Worker struct renderonly *ro,
120*61046927SAndroid Build Coastguard Worker struct winsys_handle *out_handle);
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker /**
123*61046927SAndroid Build Coastguard Worker * Import GPU resource into scanout hw.
124*61046927SAndroid Build Coastguard Worker */
125*61046927SAndroid Build Coastguard Worker struct renderonly_scanout *
126*61046927SAndroid Build Coastguard Worker renderonly_create_gpu_import_for_resource(struct pipe_resource *rsc,
127*61046927SAndroid Build Coastguard Worker struct renderonly *ro,
128*61046927SAndroid Build Coastguard Worker struct winsys_handle *out_handle);
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker #endif /* RENDERONLY_H_ */
131