nouveau/nir: Implement load_global_constant
[mesa.git] / src / gallium / drivers / zink / zink_context.h
index 0ee19885c06b0de04e6fa5d54eb1cd8ae667d051..a9c3b718cee8368243ab7b15a5a6db80f6fccefb 100644 (file)
 #include "pipe/p_state.h"
 
 #include "util/slab.h"
+#include "util/list.h"
 
 #include <vulkan/vulkan.h>
 
 struct blitter_context;
 struct primconvert_context;
+struct list_head;
 
 struct zink_blend_state;
 struct zink_depth_stencil_alpha_state;
@@ -55,7 +57,21 @@ zink_sampler_view(struct pipe_sampler_view *pview)
    return (struct zink_sampler_view *)pview;
 }
 
-#define ZINK_DIRTY_PROGRAM (1 << 0)
+struct zink_so_target {
+   struct pipe_stream_output_target base;
+   struct pipe_resource *counter_buffer;
+   VkDeviceSize counter_buffer_offset;
+   uint32_t stride;
+   bool counter_buffer_valid;
+};
+
+static inline struct zink_so_target *
+zink_so_target(struct pipe_stream_output_target *so_target)
+{
+   return (struct zink_so_target *)so_target;
+}
+
+#define ZINK_SHADER_COUNT (PIPE_SHADER_TYPES - 1)
 
 struct zink_context {
    struct pipe_context base;
@@ -68,19 +84,18 @@ struct zink_context {
 
    VkQueue queue;
 
-   VkDescriptorPool descpool;
-
    struct pipe_constant_buffer ubos[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
    struct pipe_framebuffer_state fb_state;
 
    struct zink_vertex_elements_state *element_state;
    struct zink_rasterizer_state *rast_state;
 
-   struct zink_shader *gfx_stages[PIPE_SHADER_TYPES - 1];
+   struct zink_shader *gfx_stages[ZINK_SHADER_COUNT];
    struct zink_gfx_pipeline_state gfx_pipeline_state;
    struct hash_table *program_cache;
    struct zink_gfx_program *curr_program;
-   unsigned dirty;
+
+   unsigned dirty_shader_stages : 6; /* mask of changed shader stages */
 
    struct hash_table *render_pass_cache;
 
@@ -88,21 +103,36 @@ struct zink_context {
 
    struct zink_framebuffer *framebuffer;
 
+   struct pipe_viewport_state viewport_states[PIPE_MAX_VIEWPORTS];
+   struct pipe_scissor_state scissor_states[PIPE_MAX_VIEWPORTS];
    VkViewport viewports[PIPE_MAX_VIEWPORTS];
-   unsigned num_viewports;
-
    VkRect2D scissors[PIPE_MAX_VIEWPORTS];
-   unsigned num_scissors;
+   unsigned num_viewports;
 
    struct pipe_vertex_buffer buffers[PIPE_MAX_ATTRIBS];
    uint32_t buffers_enabled_mask;
 
+   void *sampler_states[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
    VkSampler samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
+   unsigned num_samplers[PIPE_SHADER_TYPES];
    struct pipe_sampler_view *image_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS];
+   unsigned num_image_views[PIPE_SHADER_TYPES];
 
+   float line_width;
    float blend_constants[4];
 
-   uint32_t stencil_ref[2];
+   struct pipe_stencil_ref stencil_ref;
+
+   struct list_head suspended_queries;
+   bool queries_disabled;
+
+   struct pipe_resource *dummy_buffer;
+   struct pipe_resource *null_buffers[5]; /* used to create zink_framebuffer->null_surface, one buffer per samplecount */
+
+   uint32_t num_so_targets;
+   struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_OUTPUTS];
+   bool dirty_so_targets;
+   bool xfb_barrier;
 };
 
 static inline struct zink_context *
@@ -112,12 +142,18 @@ zink_context(struct pipe_context *context)
 }
 
 static inline struct zink_batch *
-zink_context_curr_batch(struct zink_context *ctx)
+zink_curr_batch(struct zink_context *ctx)
 {
    assert(ctx->curr_batch < ARRAY_SIZE(ctx->batches));
    return ctx->batches + ctx->curr_batch;
 }
 
+struct zink_batch *
+zink_batch_rp(struct zink_context *ctx);
+
+struct zink_batch *
+zink_batch_no_rp(struct zink_context *ctx);
+
 void
 zink_resource_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res,
                       VkImageAspectFlags aspect, VkImageLayout new_layout);
@@ -136,4 +172,12 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags);
 void
 zink_context_query_init(struct pipe_context *ctx);
 
+void
+zink_blit(struct pipe_context *pctx,
+          const struct pipe_blit_info *info);
+
+void
+zink_draw_vbo(struct pipe_context *pctx,
+              const struct pipe_draw_info *dinfo);
+
 #endif