1b8e80941Smrg/*
2b8e80941Smrg * Copyright (C) 2016 Christian Gmeiner <christian.gmeiner@gmail.com>
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 FROM,
20b8e80941Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21b8e80941Smrg * SOFTWARE.
22b8e80941Smrg *
23b8e80941Smrg * Authors:
24b8e80941Smrg *    Christian Gmeiner <christian.gmeiner@gmail.com>
25b8e80941Smrg */
26b8e80941Smrg
27b8e80941Smrg#ifndef RENDERONLY_H
28b8e80941Smrg#define RENDERONLY_H
29b8e80941Smrg
30b8e80941Smrg#include <stdint.h>
31b8e80941Smrg#include "state_tracker/drm_driver.h"
32b8e80941Smrg#include "pipe/p_state.h"
33b8e80941Smrg
34b8e80941Smrgstruct renderonly_scanout {
35b8e80941Smrg   uint32_t handle;
36b8e80941Smrg   uint32_t stride;
37b8e80941Smrg};
38b8e80941Smrg
39b8e80941Smrgstruct renderonly {
40b8e80941Smrg   /**
41b8e80941Smrg    * Create a renderonly_scanout object for scanout resource.
42b8e80941Smrg    *
43b8e80941Smrg    * This function creates a renderonly_scanout object based on the provided
44b8e80941Smrg    * resource. The library is designed that the driver specific pipe_resource
45b8e80941Smrg    * struct holds a pointer to a renderonly_scanout struct.
46b8e80941Smrg    *
47b8e80941Smrg    * struct driver_resource {
48b8e80941Smrg    *    struct pipe_resource base;
49b8e80941Smrg    *    struct renderonly_scanout *scanout;
50b8e80941Smrg    *   ...
51b8e80941Smrg    * };
52b8e80941Smrg    *
53b8e80941Smrg    * The renderonly_scanout object exits for two reasons:
54b8e80941Smrg    * - Do any special treatment for a scanout resource like importing the GPU
55b8e80941Smrg    *   resource into the scanout hw.
56b8e80941Smrg    * - Make it easier for a gallium driver to detect if anything special needs
57b8e80941Smrg    *   to be done in flush_resource(..) like a resolve to linear.
58b8e80941Smrg    */
59b8e80941Smrg   struct renderonly_scanout *(*create_for_resource)(struct pipe_resource *rsc,
60b8e80941Smrg                                                     struct renderonly *ro,
61b8e80941Smrg                                                     struct winsys_handle *out_handle);
62b8e80941Smrg   int kms_fd;
63b8e80941Smrg   int gpu_fd;
64b8e80941Smrg};
65b8e80941Smrg
66b8e80941Smrgstruct renderonly *
67b8e80941Smrgrenderonly_dup(const struct renderonly *ro);
68b8e80941Smrg
69b8e80941Smrgstatic inline struct renderonly_scanout *
70b8e80941Smrgrenderonly_scanout_for_resource(struct pipe_resource *rsc,
71b8e80941Smrg                                struct renderonly *ro,
72b8e80941Smrg                                struct winsys_handle *out_handle)
73b8e80941Smrg{
74b8e80941Smrg   return ro->create_for_resource(rsc, ro, out_handle);
75b8e80941Smrg}
76b8e80941Smrg
77b8e80941Smrgvoid
78b8e80941Smrgrenderonly_scanout_destroy(struct renderonly_scanout *scanout,
79b8e80941Smrg			   struct renderonly *ro);
80b8e80941Smrg
81b8e80941Smrgstatic inline boolean
82b8e80941Smrgrenderonly_get_handle(struct renderonly_scanout *scanout,
83b8e80941Smrg      struct winsys_handle *handle)
84b8e80941Smrg{
85b8e80941Smrg   if (!scanout)
86b8e80941Smrg      return FALSE;
87b8e80941Smrg
88b8e80941Smrg   assert(handle->type == WINSYS_HANDLE_TYPE_KMS);
89b8e80941Smrg   handle->handle = scanout->handle;
90b8e80941Smrg   handle->stride = scanout->stride;
91b8e80941Smrg
92b8e80941Smrg   return TRUE;
93b8e80941Smrg}
94b8e80941Smrg
95b8e80941Smrg/**
96b8e80941Smrg * Create a dumb buffer object for a resource at scanout hw.
97b8e80941Smrg */
98b8e80941Smrgstruct renderonly_scanout *
99b8e80941Smrgrenderonly_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc,
100b8e80941Smrg                                               struct renderonly *ro,
101b8e80941Smrg                                               struct winsys_handle *out_handle);
102b8e80941Smrg
103b8e80941Smrg/**
104b8e80941Smrg * Import GPU resource into scanout hw.
105b8e80941Smrg */
106b8e80941Smrgstruct renderonly_scanout *
107b8e80941Smrgrenderonly_create_gpu_import_for_resource(struct pipe_resource *rsc,
108b8e80941Smrg                                          struct renderonly *ro,
109b8e80941Smrg                                          struct winsys_handle *out_handle);
110b8e80941Smrg
111b8e80941Smrg#endif /* RENDERONLY_H_ */
112