#ifndef ST_PBO_H
#define ST_PBO_H
+struct gl_pixelstore_attrib;
+
struct st_context;
+struct st_pbo_addresses {
+ int xoffset;
+ int yoffset;
+ unsigned width;
+ unsigned height;
+ unsigned depth;
+
+ unsigned bytes_per_pixel;
+
+ /* Everything below is filled in by st_pbo_from_pixelstore */
+ unsigned pixels_per_row;
+ unsigned image_height;
+
+ /* Everything below is filled in by st_pbo_setup_buffer */
+
+ /* Buffer and view. */
+ struct pipe_resource *buffer; /* non-owning pointer */
+ unsigned first_element;
+ unsigned last_element;
+
+ /* Constant buffer for the fragment shader. */
+ struct {
+ int32_t xoffset;
+ int32_t yoffset;
+ int32_t stride;
+ int32_t image_size;
+ int32_t layer_offset;
+ } constants;
+};
+
+bool
+st_pbo_addresses_setup(struct st_context *st,
+ struct pipe_resource *buf, intptr_t buf_offset,
+ struct st_pbo_addresses *addr);
+
+bool
+st_pbo_addresses_pixelstore(struct st_context *st,
+ GLenum gl_target, bool skip_images,
+ const struct gl_pixelstore_attrib *store,
+ const void *pixels,
+ struct st_pbo_addresses *addr);
+
+void
+st_pbo_addresses_invert_y(struct st_pbo_addresses *addr,
+ unsigned viewport_height);
+
+bool
+st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr,
+ unsigned surface_width, unsigned surface_height);
+
void *
st_pbo_create_vs(struct st_context *st);
void *
st_pbo_create_gs(struct st_context *st);
+void *
+st_pbo_get_upload_fs(struct st_context *st,
+ enum pipe_format src_format,
+ enum pipe_format dst_format);
+
+void *
+st_pbo_get_download_fs(struct st_context *st, enum pipe_texture_target target,
+ enum pipe_format src_format,
+ enum pipe_format dst_format);
+
extern void
st_init_pbo_helpers(struct st_context *st);