summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/virgl/virgl_context.h
blob: 8ea3e1e2f6ea814153070e326e9400ea3cf95d28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * Copyright 2014, 2015 Red Hat.
 *
 * 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
 * on the rights to use, copy, modify, merge, publish, distribute, sub
 * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS 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 VIRGL_CONTEXT_H
#define VIRGL_CONTEXT_H

#include "pipe/p_state.h"
#include "pipe/p_context.h"
#include "util/slab.h"
#include "util/list.h"

#include "virgl_staging_mgr.h"
#include "virgl_transfer_queue.h"

struct pipe_screen;
struct tgsi_token;
struct u_upload_mgr;
struct virgl_cmd_buf;
struct virgl_vertex_elements_state;

struct virgl_sampler_view {
   struct pipe_sampler_view base;
   uint32_t handle;
};

struct virgl_so_target {
   struct pipe_stream_output_target base;
   uint32_t handle;
};

struct virgl_rasterizer_state {
   struct pipe_rasterizer_state rs;
   uint32_t handle;
};

struct virgl_shader_binding_state {
   struct pipe_sampler_view *views[16];
   uint32_t view_enabled_mask;

   struct pipe_constant_buffer ubos[PIPE_MAX_CONSTANT_BUFFERS];
   uint32_t ubo_enabled_mask;

   struct pipe_shader_buffer ssbos[PIPE_MAX_SHADER_BUFFERS];
   uint32_t ssbo_enabled_mask;

   struct pipe_image_view images[PIPE_MAX_SHADER_IMAGES];
   uint32_t image_enabled_mask;
};

struct virgl_context {
   struct pipe_context base;
   struct virgl_cmd_buf *cbuf;
   unsigned cbuf_initial_cdw;

   struct virgl_shader_binding_state shader_bindings[PIPE_SHADER_TYPES];
   struct pipe_shader_buffer atomic_buffers[PIPE_MAX_HW_ATOMIC_BUFFERS];
   uint32_t atomic_buffer_enabled_mask;

   struct virgl_vertex_elements_state *vertex_elements;

   struct pipe_framebuffer_state framebuffer;

   struct slab_child_pool transfer_pool;
   struct virgl_transfer_queue queue;
   struct u_upload_mgr *uploader;
   struct virgl_staging_mgr staging;
   bool encoded_transfers;
   bool supports_staging;

   struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
   unsigned num_vertex_buffers;
   boolean vertex_array_dirty;

   struct virgl_rasterizer_state rs_state;
   struct virgl_so_target so_targets[PIPE_MAX_SO_BUFFERS];
   unsigned num_so_targets;

   uint32_t num_draws, num_compute;

   struct primconvert_context *primconvert;
   uint32_t hw_sub_ctx_id;

   /* The total size of staging resources used in queued copy transfers. */
   uint64_t queued_staging_res_size;
};

static inline struct virgl_sampler_view *
virgl_sampler_view(struct pipe_sampler_view *view)
{
   return (struct virgl_sampler_view *)view;
};

static inline struct virgl_so_target *
virgl_so_target(struct pipe_stream_output_target *target)
{
   return (struct virgl_so_target *)target;
}

static inline struct virgl_context *virgl_context(struct pipe_context *ctx)
{
   return (struct virgl_context *)ctx;
}

struct pipe_context *virgl_context_create(struct pipe_screen *pscreen,
                                          void *priv, unsigned flags);

void virgl_init_blit_functions(struct virgl_context *vctx);
void virgl_init_query_functions(struct virgl_context *vctx);
void virgl_init_so_functions(struct virgl_context *vctx);

struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct tgsi_token *tokens_in);

bool
virgl_can_rebind_resource(struct virgl_context *vctx,
                          struct pipe_resource *res);

void
virgl_rebind_resource(struct virgl_context *vctx,
                      struct pipe_resource *res);

#endif