#include "util/u_blitter.h"
#include "util/hash_table.h"
+#include "midgard/midgard_compile.h"
+
/* Forward declare to avoid extra header dep */
struct prim_convert_context;
struct panfrost_job *job;
struct hash_table *jobs;
+ /* panfrost_resource -> panfrost_job */
+ struct hash_table *write_jobs;
+
/* Bit mask for supported PIPE_DRAW for this hardware */
unsigned draw_modes;
struct panfrost_query *occlusion_query;
- /* Each render job has multiple framebuffer descriptors associated with
- * it, used for various purposes with more or less the same format. The
- * most obvious is the fragment framebuffer descriptor, which carries
- * e.g. clearing information */
-
- union {
- struct mali_single_framebuffer fragment_sfbd;
- struct {
- struct bifrost_framebuffer fragment_mfbd;
- struct bifrost_fb_extra fragment_extra;
- struct bifrost_render_target fragment_rts[4];
- };
- };
-
/* Each draw has corresponding vertex and tiler payloads */
struct midgard_payload_vertex_tiler payload_vertex;
struct midgard_payload_vertex_tiler payload_tiler;
unsigned varying_height;
- struct mali_viewport *viewport;
struct mali_single_framebuffer vt_framebuffer_sfbd;
struct bifrost_framebuffer vt_framebuffer_mfbd;
struct panfrost_vertex_state *vertex;
- struct pipe_vertex_buffer *vertex_buffers;
- unsigned vertex_buffer_count;
+ struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
+ uint32_t vb_mask;
struct panfrost_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
unsigned sampler_count[PIPE_SHADER_TYPES];
/* Compiled fixed function command */
struct mali_blend_equation equation;
+ float constant;
/* Compiled blend shader */
mali_ptr blend_shader;
int blend_work_count;
};
-/* Internal varyings descriptor */
-struct panfrost_varyings {
- /* Varyings information: stride of each chunk of memory used for
- * varyings (similar structure with attributes). Count is just the
- * number of vec4's. Buffer count is the number of varying chunks (<=
- * count). Height is used to calculate gl_Position's position ("it's
- * not a pun, Alyssa!"). Vertex-only varyings == descriptor for
- * gl_Position and something else apparently occupying the same space.
- * Varyings == main varyings descriptors following typical mali_attr
- * conventions. */
-
- unsigned varyings_stride[MAX_VARYINGS];
- unsigned varying_count;
- unsigned varying_buffer_count;
-
- /* Map of the actual varyings buffer */
- uint8_t *varyings_buffer_cpu;
- mali_ptr varyings_descriptor;
- mali_ptr varyings_descriptor_fragment;
-};
-
/* Variants bundle together to form the backing CSO, bundling multiple
* shaders with varying emulated features baked in (alpha test
* parameters, etc) */
int uniform_count;
bool can_discard;
bool writes_point_size;
+ bool reads_point_coord;
+
+ unsigned general_varying_stride;
+ struct mali_attr_meta varyings[PIPE_MAX_ATTRIBS];
- /* Valid for vertex shaders only due to when this is calculated */
- struct panfrost_varyings varyings;
+ unsigned sysval_count;
+ unsigned sysval[MAX_SYSVAL_COUNT];
/* Information on this particular shader variant */
struct pipe_alpha_state alpha_state;
unsigned num_elements;
struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS];
- int nr_components[PIPE_MAX_ATTRIBS];
-
- /* The actual attribute meta, prebaked and GPU mapped. TODO: Free memory */
- struct mali_attr_meta *hw;
- mali_ptr descriptor_ptr;
+ struct mali_attr_meta hw[PIPE_MAX_ATTRIBS];
};
struct panfrost_sampler_state {
return (struct panfrost_context *) pcontext;
}
-static inline struct panfrost_screen *
-pan_screen(struct pipe_screen *p)
-{
- return (struct panfrost_screen *)p;
-}
-
struct pipe_context *
panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags);
panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data);
struct panfrost_transfer
-panfrost_vertex_tiler_job(struct panfrost_context *ctx, bool is_tiler, bool is_elided_tiler);
+panfrost_vertex_tiler_job(struct panfrost_context *ctx, bool is_tiler);
unsigned
panfrost_get_default_swizzle(unsigned components);
bool
panfrost_is_scanout(struct panfrost_context *ctx);
-mali_ptr
-panfrost_sfbd_fragment(struct panfrost_context *ctx);
-
-mali_ptr
-panfrost_mfbd_fragment(struct panfrost_context *ctx);
+mali_ptr panfrost_sfbd_fragment(struct panfrost_context *ctx);
+mali_ptr panfrost_mfbd_fragment(struct panfrost_context *ctx);
struct bifrost_framebuffer
panfrost_emit_mfbd(struct panfrost_context *ctx);