#ifndef R300_CONTEXT_H
#define R300_CONTEXT_H
+#define R300_BUFFER_ALIGNMENT 64
+
#include "draw/draw_vertex.h"
#include "util/u_blitter.h"
#include "pipe/p_context.h"
#include "util/u_inlines.h"
#include "util/u_transfer.h"
-#include "util/u_vbuf_mgr.h"
#include "r300_defines.h"
#include "r300_screen.h"
-#include "r300_winsys.h"
+#include "compiler/radeon_regalloc.h"
+#include "../../winsys/radeon/drm/radeon_winsys.h"
struct u_upload_mgr;
struct r300_context;
struct r300_vertex_shader;
struct r300_stencilref_context;
+enum colormask_swizzle {
+ COLORMASK_BGRA,
+ COLORMASK_RGBA,
+ COLORMASK_RRRR,
+ COLORMASK_AAAA,
+ COLORMASK_GRRG,
+ COLORMASK_ARRA,
+ COLORMASK_NUM_SWIZZLES
+};
+
struct r300_atom {
/* Name, for debugging. */
const char* name;
};
struct r300_blend_state {
- uint32_t cb[8];
+ struct pipe_blend_state state;
+
+ uint32_t cb_clamp[COLORMASK_NUM_SWIZZLES][8];
+ uint32_t cb_noclamp[8];
uint32_t cb_no_readwrite[8];
};
};
struct r300_clip_state {
- struct pipe_clip_state clip;
-
uint32_t cb[29];
};
uint32_t cb_flush_clean[6];
};
-#define RS_STATE_MAIN_SIZE 23
+#define RS_STATE_MAIN_SIZE 27
struct r300_rs_state {
/* Original rasterizer state. */
uint32_t format1; /* R300_TX_FORMAT1: 0x44c0 */
uint32_t format2; /* R300_TX_FORMAT2: 0x4500 */
uint32_t tile_config; /* R300_TX_OFFSET (subset thereof) */
+ uint32_t us_format0; /* R500_US_FORMAT0_0: 0x4640 (through 15) */
};
struct r300_sampler_view {
struct pipe_sampler_view base;
+ /* For resource_copy_region. */
+ unsigned width0_override;
+ unsigned height0_override;
+
/* Swizzles in the UTIL_FORMAT_SWIZZLE_* representation,
* derived from base. */
unsigned char swizzle[4];
struct r300_texture_format_state format;
uint32_t filter0; /* R300_TX_FILTER0: 0x4400 */
uint32_t filter1; /* R300_TX_FILTER1: 0x4440 */
- uint32_t border_color; /* R300_TX_BORDER_COLOR: 0x45c0 */
+ uint32_t border_color; /* R300_TX_BORDER_COLOR: 0x45c0 */
};
struct r300_textures_state {
};
struct r300_invariant_state {
- uint32_t cb[26];
+ uint32_t cb[24];
};
struct r300_vap_invariant_state {
boolean begin_emitted;
/* The buffer where query results are stored. */
- struct r300_winsys_bo *buf;
- struct r300_winsys_cs_handle *cs_buf;
- /* The size of the buffer. */
- unsigned buffer_size;
- /* The domain of the buffer. */
- enum r300_buffer_domain domain;
-
- /* Linked list members. */
- struct r300_query* prev;
- struct r300_query* next;
+ struct pb_buffer *buf;
+ struct radeon_winsys_cs_handle *cs_buf;
};
struct r300_surface {
struct pipe_surface base;
/* Winsys buffer backing the texture. */
- struct r300_winsys_bo *buf;
- struct r300_winsys_cs_handle *cs_buf;
+ struct pb_buffer *buf;
+ struct radeon_winsys_cs_handle *cs_buf;
- enum r300_buffer_domain domain;
+ enum radeon_bo_domain domain;
uint32_t offset; /* COLOROFFSET or DEPTHOFFSET. */
uint32_t pitch; /* COLORPITCH or DEPTHPITCH. */
/* Whether the CBZB clear is allowed on the surface. */
boolean cbzb_allowed;
+
+ unsigned colormask_swizzle;
};
struct r300_texture_desc {
/* Buffer tiling.
* Macrotiling is specified per-level because small mipmaps cannot
* be macrotiled. */
- enum r300_buffer_tiling microtile;
- enum r300_buffer_tiling macrotile[R300_MAX_TEXTURE_LEVELS];
+ enum radeon_bo_layout microtile;
+ enum radeon_bo_layout macrotile[R300_MAX_TEXTURE_LEVELS];
/* Offsets into the buffer. */
unsigned offset_in_bytes[R300_MAX_TEXTURE_LEVELS];
/* Strides for each mip-level. */
- unsigned stride_in_pixels[R300_MAX_TEXTURE_LEVELS];
unsigned stride_in_bytes[R300_MAX_TEXTURE_LEVELS];
/* Size of one zslice or face or 2D image based on the texture target. */
* derived from the texture properties. */
unsigned size_in_bytes;
- /* Total size of the buffer backing this texture, in bytes.
- * It must be >= size. */
- unsigned buffer_size_in_bytes;
-
/**
* If non-zero, override the natural texture layout with
* a custom stride (in bytes).
struct r300_resource
{
- struct u_vbuf_resource b;
+ struct u_resource b;
/* Winsys buffer backing this resource. */
- struct r300_winsys_bo *buf;
- struct r300_winsys_cs_handle *cs_buf;
- enum r300_buffer_domain domain;
- unsigned buf_size;
+ struct pb_buffer *buf;
+ struct radeon_winsys_cs_handle *cs_buf;
+ enum radeon_bo_domain domain;
- /* Constant buffers are in user memory. */
- uint8_t *constant_buffer;
+ /* Constant buffers and SWTCL vertex and index buffers are in user
+ * memory. */
+ uint8_t *malloced_buffer;
/* Texture description (addressing, layout, special features). */
struct r300_texture_desc tex;
- /* Registers carrying texture format data. */
- /* Only format-independent bits should be filled in. */
- struct r300_texture_format_state tx_format;
-
- /* Where the texture starts in the buffer. */
- unsigned tex_offset;
-
/* This is the level tiling flags were last time set for.
* It's used to prevent redundant tiling-flags changes from happening.*/
unsigned surface_level;
struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
unsigned format_size[PIPE_MAX_ATTRIBS];
- struct u_vbuf_mgr_elements *vmgr_elements;
-
/* The size of the vertex, in dwords. */
unsigned vertex_size_dwords;
HIZ_FUNC_MIN,
};
+/* For deferred fragment shader state validation. */
+enum r300_fs_validity_status {
+ FRAGMENT_SHADER_VALID, /* No need to change/validate the FS. */
+ FRAGMENT_SHADER_MAYBE_DIRTY,/* Validate the FS if external state was changed. */
+ FRAGMENT_SHADER_DIRTY /* Always validate the FS (if the FS was changed) */
+};
+
struct r300_context {
/* Parent class */
struct pipe_context context;
/* The interface to the windowing system, etc. */
- struct r300_winsys_screen *rws;
+ struct radeon_winsys *rws;
/* The command stream. */
- struct r300_winsys_cs *cs;
+ struct radeon_winsys_cs *cs;
/* Screen. */
struct r300_screen *screen;
/* When no vertex buffer is set, this one is used instead to prevent
* hardlocks. */
- struct pipe_resource *dummy_vb;
+ struct pipe_vertex_buffer dummy_vb;
/* The currently active query. */
struct r300_query *query_current;
/* Vertex elements for Gallium. */
struct r300_vertex_element_state *velems;
- struct pipe_index_buffer index_buffer;
-
/* Vertex info for Draw. */
struct vertex_info vertex_info;
uint32_t zbuffer_bpp;
/* Whether rendering is conditional and should be skipped. */
boolean skip_rendering;
+ /* The flag above saved by blitter. */
+ unsigned char blitter_saved_skip_rendering;
/* Point sprites texcoord index, 1 bit per texcoord */
int sprite_coord_enable;
/* Whether two-sided color selection is enabled (AKA light_twoside). */
boolean two_sided_color;
/* Whether fast color clear is enabled. */
boolean cbzb_clear;
- /* Whether ZMASK is enabled. */
- boolean zmask_in_use;
- /* Whether ZMASK is being decompressed. */
- boolean zmask_decompress;
- /* Whether ZMASK/HIZ is locked, i.e. should be disabled and cannot be taken over. */
- boolean hyperz_locked;
- /* The zbuffer the ZMASK of which is locked. */
- struct pipe_surface *locked_zbuffer;
- /* Whether HIZ is enabled. */
- boolean hiz_in_use;
- /* HiZ function. Can be either MIN or MAX. */
- enum r300_hiz_func hiz_func;
- /* HiZ clear value. */
- uint32_t hiz_clear_value;
+ /* Whether fragment shader needs to be validated. */
+ enum r300_fs_validity_status fs_status;
+ /* Framebuffer multi-write. */
+ boolean fb_multiwrite;
void *dsa_decompress_zmask;
- struct u_vbuf_mgr *vbuf_mgr;
+ struct pipe_index_buffer index_buffer;
+ struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
+ unsigned nr_vertex_buffers;
+ struct u_upload_mgr *uploader;
struct util_slab_mempool pool_transfers;
boolean vertex_arrays_dirty;
boolean vertex_arrays_indexed;
int vertex_arrays_offset;
+ int vertex_arrays_instance_id;
+ boolean instancing_enabled;
+
+ /* Hyper-Z stats. */
+ boolean hyperz_enabled; /* Whether it owns Hyper-Z access. */
+ int64_t hyperz_time_of_last_flush; /* Time of the last flush with Z clear. */
+ unsigned num_z_clears; /* Since the last flush. */
+
+ /* ZMask state. */
+ boolean zmask_in_use; /* Whether ZMASK is enabled. */
+ boolean zmask_decompress; /* Whether ZMASK is being decompressed. */
+ struct pipe_surface *locked_zbuffer; /* Unbound zbuffer which still has data in ZMASK. */
+
+ /* HiZ state. */
+ boolean hiz_in_use; /* Whether HIZ is enabled. */
+ enum r300_hiz_func hiz_func; /* HiZ function. Can be either MIN or MAX. */
+ uint32_t hiz_clear_value; /* HiZ clear value. */
+
+ /* Compiler state. */
+ struct rc_regalloc_state fs_regalloc_state; /* Register allocator info for
+ * fragment shaders. */
};
#define foreach_atom(r300, atom) \
struct pipe_context* r300_create_context(struct pipe_screen* screen,
void *priv);
-void r300_flush_cb(void *data);
-
/* Context initialization. */
struct draw_stage* r300_draw_stage(struct r300_context* r300);
void r300_init_blit_functions(struct r300_context *r300);
void r300_decompress_zmask(struct r300_context *r300);
void r300_decompress_zmask_locked_unsafe(struct r300_context *r300);
void r300_decompress_zmask_locked(struct r300_context *r300);
+bool r300_is_blit_supported(enum pipe_format format);
+
+/* r300_flush.c */
+void r300_flush(struct pipe_context *pipe,
+ unsigned flags,
+ struct pipe_fence_handle **fence);
/* r300_hyperz.c */
void r300_update_hyperz_state(struct r300_context* r300);
/* r300_render_translate.c */
void r300_translate_index_buffer(struct r300_context *r300,
- struct pipe_resource **index_buffer,
+ struct pipe_index_buffer *ib,
+ struct pipe_resource **out_index_buffer,
unsigned *index_size, unsigned index_offset,
unsigned *start, unsigned count);
/* r300_render.c */
void r300_draw_flush_vbuf(struct r300_context *r300);
void r500_emit_index_bias(struct r300_context *r300, int index_bias);
+void r300_blitter_draw_rectangle(struct blitter_context *blitter,
+ int x1, int y1, int x2, int y2,
+ float depth,
+ enum blitter_attrib_type type,
+ const union pipe_color_union *attrib);
/* r300_state.c */
enum r300_fb_state_change {
enum r300_fb_state_change change);
void r300_mark_fs_code_dirty(struct r300_context *r300);
+struct pipe_sampler_view *
+r300_create_sampler_view_custom(struct pipe_context *pipe,
+ struct pipe_resource *texture,
+ const struct pipe_sampler_view *templ,
+ unsigned width0_override,
+ unsigned height0_override);
+
/* r300_state_derived.c */
void r300_update_derived_state(struct r300_context* r300);