#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"
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_BGRX,
+ COLORMASK_RGBX,
+ COLORMASK_NUM_SWIZZLES
+};
+
struct r300_atom {
/* Name, for debugging. */
const char* name;
struct r300_surface *dest;
uint32_t aa_config;
- uint32_t aaresolve_ctl;
};
struct r300_blend_state {
struct pipe_blend_state state;
- uint32_t cb_clamp[8];
+ uint32_t cb_clamp[COLORMASK_NUM_SWIZZLES][8];
uint32_t cb_noclamp[8];
+ uint32_t cb_noclamp_noalpha[8];
uint32_t cb_no_readwrite[8];
};
};
struct r300_clip_state {
- struct pipe_clip_state clip;
-
uint32_t cb[29];
};
/* This is actually a command buffer with named dwords. */
uint32_t cb_begin;
- uint32_t alpha_function; /* R300_FG_ALPHA_FUNC: 0x4bd4 */
- uint32_t cb_reg_seq;
uint32_t z_buffer_control; /* R300_ZB_CNTL: 0x4f00 */
uint32_t z_stencil_control; /* R300_ZB_ZSTENCILCNTL: 0x4f04 */
uint32_t stencil_ref_mask; /* R300_ZB_STENCILREFMASK: 0x4f08 */
uint32_t cb_reg1;
uint32_t alpha_value; /* R500_FG_ALPHA_VALUE: 0x4be0 */
- /* The same, but for FP16 alpha test. */
- uint32_t cb_begin_fp16;
- uint32_t alpha_function_fp16; /* R300_FG_ALPHA_FUNC: 0x4bd4 */
- uint32_t cb_reg_seq_fp16;
- uint32_t z_buffer_control_fp16; /* R300_ZB_CNTL: 0x4f00 */
- uint32_t z_stencil_control_fp16; /* R300_ZB_ZSTENCILCNTL: 0x4f04 */
- uint32_t stencil_ref_mask_fp16; /* R300_ZB_STENCILREFMASK: 0x4f08 */
- uint32_t cb_reg_fp16;
- uint32_t stencil_ref_bf_fp16; /* R500_ZB_STENCILREFMASK_BF: 0x4fd4 */
- uint32_t cb_reg1_fp16;
- uint32_t alpha_value_fp16; /* R500_FG_ALPHA_VALUE: 0x4be0 */
-
- /* The second command buffer disables zbuffer reads and writes. */
- uint32_t cb_zb_no_readwrite[10];
- uint32_t cb_fp16_zb_no_readwrite[10];
+ /* Same, but without ZB reads and writes. */
+ uint32_t cb_zb_no_readwrite[8]; /* ZB not bound */
+
+ /* Emitted separately: */
+ uint32_t alpha_function;
/* Whether a two-sided stencil is enabled. */
boolean two_sided;
uint32_t cb_flush_clean[6];
};
-#define RS_STATE_MAIN_SIZE 25
+#define RS_STATE_MAIN_SIZE 27
struct r300_rs_state {
/* Original rasterizer state. */
struct r300_sampler_view {
struct pipe_sampler_view base;
- /* Swizzles in the UTIL_FORMAT_SWIZZLE_* representation,
+ /* For resource_copy_region. */
+ unsigned width0_override;
+ unsigned height0_override;
+
+ /* Swizzles in the PIPE_SWIZZLE_* representation,
* derived from base. */
unsigned char swizzle[4];
* This is not a subclass of pipe_query because pipe_query is never
* actually fully defined. So, rather than have it as a member, and do
* subclass-style casting, we treat pipe_query as an opaque, and just
- * trust that our state tracker does not ever mess up query objects.
+ * trust that our gallium frontend does not ever mess up query objects.
*/
struct r300_query {
/* The kind of query. Currently only OQ is supported. */
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 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;
- enum r300_buffer_domain domain;
+ enum radeon_bo_domain domain;
uint32_t offset; /* COLOROFFSET or DEPTHOFFSET. */
uint32_t pitch; /* COLORPITCH or DEPTHPITCH. */
uint32_t pitch_zmask; /* ZMASK_PITCH */
uint32_t pitch_hiz; /* HIZ_PITCH */
+ uint32_t pitch_cmask; /* CMASK_PITCH */
uint32_t format; /* US_OUT_FMT or ZB_FORMAT. */
/* Parameters dedicated to the CBZB clear. */
/* 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).
/* Zmask/HiZ strides for each miplevel. */
unsigned zmask_stride_in_pixels[R300_MAX_TEXTURE_LEVELS];
unsigned hiz_stride_in_pixels[R300_MAX_TEXTURE_LEVELS];
+
+ /* CMASK info for AA buffers (no mipmapping). */
+ unsigned cmask_dwords;
+ unsigned cmask_stride_in_pixels;
};
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;
+ 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;
struct pipe_context context;
/* The interface to the windowing system, etc. */
- struct r300_winsys_screen *rws;
+ struct radeon_winsys *rws;
+ /* The submission context. */
+ struct radeon_winsys_ctx *ctx;
/* The command stream. */
- struct r300_winsys_cs *cs;
+ struct radeon_cmdbuf *cs;
/* Screen. */
struct r300_screen *screen;
/* Draw module. Used mostly for SW TCL. */
struct draw_context* draw;
/* Vertex buffer for SW TCL. */
- struct pipe_resource* vbo;
+ struct pb_buffer *vbo;
/* Offset and size into the SW TCL VBO. */
size_t draw_vbo_offset;
- size_t draw_vbo_size;
- /* Whether the VBO must not be flushed. */
- boolean draw_vbo_locked;
- boolean draw_first_emitted;
/* Accelerated blit support. */
struct blitter_context* blitter;
/* 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;
* performance and stability if not handled with care. */
/* GPU flush. */
struct r300_atom gpu_flush;
+ /* Clears must be emitted immediately after the flush. */
+ /* HiZ clear */
+ struct r300_atom hiz_clear;
+ /* zmask clear */
+ struct r300_atom zmask_clear;
+ /* cmask clear */
+ struct r300_atom cmask_clear;
/* Anti-aliasing (MSAA) state. */
struct r300_atom aa_state;
/* Framebuffer state. */
struct r300_atom blend_color_state;
/* Scissor state. */
struct r300_atom scissor_state;
+ /* Sample mask. */
+ struct r300_atom sample_mask;
/* Invariant state. This must be emitted to get the engine started. */
struct r300_atom invariant_state;
/* Viewport state. */
struct r300_atom texture_cache_inval;
/* Textures state. */
struct r300_atom textures_state;
- /* HiZ clear */
- struct r300_atom hiz_clear;
- /* zmask clear */
- struct r300_atom zmask_clear;
/* Occlusion query. */
struct r300_atom query_start;
/* 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 fragment color clamping is enabled. */
- boolean frag_clamp;
+ boolean flatshade;
+ boolean clip_halfz;
/* 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;
+ unsigned num_samples;
+ boolean msaa_enable;
+ boolean alpha_to_one;
+ boolean alpha_to_coverage;
void *dsa_decompress_zmask;
- struct u_vbuf_mgr *vbuf_mgr;
+ struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
+ unsigned nr_vertex_buffers;
+ struct u_upload_mgr *uploader;
- struct util_slab_mempool pool_transfers;
+ struct slab_child_pool pool_transfers;
/* Stat counter. */
uint64_t flush_counter;
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. */
+
+ /* CMASK state. */
+ boolean cmask_access;
+ boolean cmask_in_use;
+ uint32_t color_clear_value; /* RGBA8 or RGBA1010102 */
+ uint32_t color_clear_value_ar; /* RGBA16F */
+ uint32_t color_clear_value_gb; /* RGBA16F */
+
+ /* Compiler state. */
+ struct rc_regalloc_state fs_regalloc_state; /* Register allocator info for
+ * fragment shaders. */
};
#define foreach_atom(r300, atom) \
for (atom = r300->first_dirty; atom != r300->last_dirty; atom++)
/* Convenience cast wrappers. */
-static INLINE struct r300_query* r300_query(struct pipe_query* q)
+static inline struct r300_query* r300_query(struct pipe_query* q)
{
return (struct r300_query*)q;
}
-static INLINE struct r300_surface* r300_surface(struct pipe_surface* surf)
+static inline struct r300_surface* r300_surface(struct pipe_surface* surf)
{
return (struct r300_surface*)surf;
}
-static INLINE struct r300_resource* r300_resource(struct pipe_resource* tex)
+static inline struct r300_resource* r300_resource(struct pipe_resource* tex)
{
return (struct r300_resource*)tex;
}
-static INLINE struct r300_context* r300_context(struct pipe_context* context)
+static inline struct r300_context* r300_context(struct pipe_context* context)
{
return (struct r300_context*)context;
}
-static INLINE struct r300_fragment_shader *r300_fs(struct r300_context *r300)
+static inline struct r300_fragment_shader *r300_fs(struct r300_context *r300)
{
return (struct r300_fragment_shader*)r300->fs.state;
}
-static INLINE void r300_mark_atom_dirty(struct r300_context *r300,
+static inline void r300_mark_atom_dirty(struct r300_context *r300,
struct r300_atom *atom)
{
atom->dirty = TRUE;
}
}
+static inline struct pipe_surface *
+r300_get_nonnull_cb(struct pipe_framebuffer_state *fb, unsigned i)
+{
+ if (fb->cbufs[i])
+ return fb->cbufs[i];
+
+ /* The i-th framebuffer is NULL, return any non-NULL one. */
+ for (i = 0; i < fb->nr_cbufs; i++)
+ if (fb->cbufs[i])
+ return fb->cbufs[i];
+
+ return NULL;
+}
+
struct pipe_context* r300_create_context(struct pipe_screen* screen,
- void *priv);
+ void *priv, unsigned flags);
/* Context initialization. */
struct draw_stage* r300_draw_stage(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,
/* r300_render_translate.c */
void r300_translate_index_buffer(struct r300_context *r300,
- struct pipe_resource **index_buffer,
+ const struct pipe_draw_info *info,
+ struct pipe_resource **out_index_buffer,
unsigned *index_size, unsigned index_offset,
unsigned *start, unsigned count);
void r300_plug_in_stencil_ref_fallback(struct r300_context *r300);
/* 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,
+ void *vertex_elements_cso,
+ blitter_get_vs_func get_vs,
+ int x1, int y1, int x2, int y2,
+ float depth, unsigned num_instances,
+ enum blitter_attrib_type type,
+ const union blitter_attrib *attrib);
/* r300_state.c */
enum r300_fb_state_change {
R300_CHANGED_FB_STATE = 0,
R300_CHANGED_HYPERZ_FLAG,
- R300_CHANGED_MULTIWRITE
+ R300_CHANGED_MULTIWRITE,
+ R300_CHANGED_CMASK_ENABLE,
};
void r300_mark_fb_state_dirty(struct r300_context *r300,
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);
void r500_dump_rs_block(struct r300_rs_block *rs);
-static INLINE boolean CTX_DBG_ON(struct r300_context * ctx, unsigned flags)
+static inline boolean CTX_DBG_ON(struct r300_context * ctx, unsigned flags)
{
return SCREEN_DBG_ON(ctx->screen, flags);
}
-static INLINE void CTX_DBG(struct r300_context * ctx, unsigned flags,
+static inline void CTX_DBG(struct r300_context * ctx, unsigned flags,
const char * fmt, ...)
{
if (CTX_DBG_ON(ctx, flags)) {