2010-09-22 17:37:30 -04:00
|
|
|
/*
|
|
|
|
* Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
|
|
|
* license, and/or sell copies of the Software, and to permit persons to whom
|
|
|
|
* the Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice (including the next
|
|
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
|
|
* Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
|
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
|
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
|
|
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Jerome Glisse
|
|
|
|
*/
|
|
|
|
#ifndef R600_PIPE_H
|
|
|
|
#define R600_PIPE_H
|
|
|
|
|
2013-08-13 21:49:59 +02:00
|
|
|
#include "../radeon/r600_pipe_common.h"
|
|
|
|
#include "../radeon/r600_cs.h"
|
|
|
|
|
|
|
|
#include "r600_llvm.h"
|
|
|
|
#include "r600_public.h"
|
|
|
|
#include "r600_resource.h"
|
|
|
|
|
2012-08-24 05:57:22 +02:00
|
|
|
#include "util/u_blitter.h"
|
2012-12-09 17:56:26 +01:00
|
|
|
#include "util/u_suballoc.h"
|
2013-03-03 14:33:00 +01:00
|
|
|
#include "util/u_double_list.h"
|
|
|
|
#include "util/u_transfer.h"
|
2010-09-29 14:26:29 -04:00
|
|
|
|
2013-04-22 20:06:54 -07:00
|
|
|
#define R600_NUM_ATOMS 41
|
2012-09-05 15:18:24 -04:00
|
|
|
|
2013-03-03 14:21:34 +01:00
|
|
|
/* the number of CS dwords for flushing and drawing */
|
|
|
|
#define R600_MAX_FLUSH_CS_DWORDS 16
|
|
|
|
#define R600_MAX_DRAW_CS_DWORDS 34
|
|
|
|
#define R600_TRACE_CS_DWORDS 7
|
|
|
|
|
2012-12-16 10:26:02 +00:00
|
|
|
#define R600_MAX_USER_CONST_BUFFERS 13
|
2012-12-16 10:31:32 +00:00
|
|
|
#define R600_MAX_DRIVER_CONST_BUFFERS 3
|
2012-11-06 15:31:41 +10:00
|
|
|
#define R600_MAX_CONST_BUFFERS (R600_MAX_USER_CONST_BUFFERS + R600_MAX_DRIVER_CONST_BUFFERS)
|
|
|
|
|
|
|
|
/* start driver buffers after user buffers */
|
|
|
|
#define R600_UCP_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS)
|
2012-11-03 20:53:33 +10:00
|
|
|
#define R600_TXQ_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 1)
|
2012-12-16 10:31:32 +00:00
|
|
|
#define R600_BUFFER_INFO_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 2)
|
2012-11-06 15:31:41 +10:00
|
|
|
|
2011-03-07 21:15:03 +01:00
|
|
|
#define R600_MAX_CONST_BUFFER_SIZE 4096
|
2011-02-07 15:22:08 +01:00
|
|
|
|
2011-04-25 13:28:55 +02:00
|
|
|
#ifdef PIPE_ARCH_BIG_ENDIAN
|
|
|
|
#define R600_BIG_ENDIAN 1
|
|
|
|
#else
|
|
|
|
#define R600_BIG_ENDIAN 0
|
|
|
|
#endif
|
|
|
|
|
2013-03-03 14:33:00 +01:00
|
|
|
struct r600_context;
|
2012-10-16 14:38:54 +00:00
|
|
|
struct r600_bytecode;
|
2012-10-12 18:30:51 +02:00
|
|
|
struct r600_shader_key;
|
|
|
|
|
2012-01-31 10:50:51 +01:00
|
|
|
/* This is an atom containing GPU commands that never change.
|
|
|
|
* This is supposed to be copied directly into the CS. */
|
|
|
|
struct r600_command_buffer {
|
|
|
|
uint32_t *buf;
|
2012-10-05 00:20:27 +02:00
|
|
|
unsigned num_dw;
|
2012-01-31 10:50:51 +01:00
|
|
|
unsigned max_num_dw;
|
2012-06-25 20:00:47 +00:00
|
|
|
unsigned pkt_flags;
|
2012-01-31 10:50:51 +01:00
|
|
|
};
|
|
|
|
|
r600g: add htile support v16
htile is used for HiZ and HiS support and fast Z/S clears.
This commit just adds the htile setup and Fast Z clear.
We don't take full advantage of HiS with that patch.
v2 really use fast clear, still random issue with some tiles
need to try more flush combination, fix depth/stencil
texture decompression
v3 fix random issue on r6xx/r7xx
v4 rebase on top of lastest mesa, disable CB export when clearing
htile surface to avoid wasting bandwidth
v5 resummarize htile surface when uploading z value. Fix z/stencil
decompression, the custom blitter with custom dsa is no longer
needed.
v6 Reorganize render control/override update mecanism, fixing more
issues in the process.
v7 Add nop after depth surface base update to work around some htile
flushing issue. For htile to 8x8 on r6xx/r7xx as other combination
have issue. Do not enable hyperz when flushing/uncompressing
depth buffer.
v8 Fix htile surface, preload and prefetch setup. Only set preload
and prefetch on htile surface clear like fglrx. Record depth
clear value per level. Support several level for the htile
surface. First depth clear can't be a fast clear.
v9 Fix comments, properly account new register in emit function,
disable fast zclear if clearing different layer of texture
array to different value
v10 Disable hyperz for texture array making test simpler. Force
db_misc_state update when no depth buffer is bound. Remove
unused variable, rename depth_clearstencil to depth_clear.
Don't allocate htile surface for flushed depth. Something
broken the cliprect change, this need to be investigated.
v11 Rebase on top of newer mesa
v12 Rebase on top of newer mesa
v13 Rebase on top of newer mesa, htile surface need to be initialized
to zero, somehow special casing first clear to not use fast clear
and thus initialize the htile surface with proper value does not
work in all case.
v14 Use resource not texture for htile buffer make the htile buffer
size computation easier and simpler. Disable preload on evergreen
as its still troublesome in some case
v15 Cleanup some comment and remove some left over
v16 Define name for bit 20 of CP_COHER_CNTL
Signed-off-by: Pierre-Eric Pelloux-Prayer <pelloux@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
2012-10-11 10:40:30 -04:00
|
|
|
struct r600_db_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct r600_surface *rsurf;
|
|
|
|
};
|
|
|
|
|
2012-03-05 16:20:05 +01:00
|
|
|
struct r600_db_misc_state {
|
r600g: add htile support v16
htile is used for HiZ and HiS support and fast Z/S clears.
This commit just adds the htile setup and Fast Z clear.
We don't take full advantage of HiS with that patch.
v2 really use fast clear, still random issue with some tiles
need to try more flush combination, fix depth/stencil
texture decompression
v3 fix random issue on r6xx/r7xx
v4 rebase on top of lastest mesa, disable CB export when clearing
htile surface to avoid wasting bandwidth
v5 resummarize htile surface when uploading z value. Fix z/stencil
decompression, the custom blitter with custom dsa is no longer
needed.
v6 Reorganize render control/override update mecanism, fixing more
issues in the process.
v7 Add nop after depth surface base update to work around some htile
flushing issue. For htile to 8x8 on r6xx/r7xx as other combination
have issue. Do not enable hyperz when flushing/uncompressing
depth buffer.
v8 Fix htile surface, preload and prefetch setup. Only set preload
and prefetch on htile surface clear like fglrx. Record depth
clear value per level. Support several level for the htile
surface. First depth clear can't be a fast clear.
v9 Fix comments, properly account new register in emit function,
disable fast zclear if clearing different layer of texture
array to different value
v10 Disable hyperz for texture array making test simpler. Force
db_misc_state update when no depth buffer is bound. Remove
unused variable, rename depth_clearstencil to depth_clear.
Don't allocate htile surface for flushed depth. Something
broken the cliprect change, this need to be investigated.
v11 Rebase on top of newer mesa
v12 Rebase on top of newer mesa
v13 Rebase on top of newer mesa, htile surface need to be initialized
to zero, somehow special casing first clear to not use fast clear
and thus initialize the htile surface with proper value does not
work in all case.
v14 Use resource not texture for htile buffer make the htile buffer
size computation easier and simpler. Disable preload on evergreen
as its still troublesome in some case
v15 Cleanup some comment and remove some left over
v16 Define name for bit 20 of CP_COHER_CNTL
Signed-off-by: Pierre-Eric Pelloux-Prayer <pelloux@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
2012-10-11 10:40:30 -04:00
|
|
|
struct r600_atom atom;
|
|
|
|
bool occlusion_query_enabled;
|
|
|
|
bool flush_depthstencil_through_cb;
|
|
|
|
bool flush_depthstencil_in_place;
|
|
|
|
bool copy_depth, copy_stencil;
|
|
|
|
unsigned copy_sample;
|
|
|
|
unsigned log_samples;
|
|
|
|
unsigned db_shader_control;
|
|
|
|
bool htile_clear;
|
2012-02-02 14:01:12 +01:00
|
|
|
};
|
|
|
|
|
2012-07-07 07:15:04 +02:00
|
|
|
struct r600_cb_misc_state {
|
|
|
|
struct r600_atom atom;
|
2012-07-07 07:40:36 +02:00
|
|
|
unsigned cb_color_control; /* this comes from blend state */
|
2012-07-07 07:15:04 +02:00
|
|
|
unsigned blend_colormask; /* 8*4 bits for 8 RGBA colorbuffers */
|
|
|
|
unsigned nr_cbufs;
|
2012-07-07 09:01:38 +02:00
|
|
|
unsigned nr_ps_color_outputs;
|
2012-07-07 07:40:36 +02:00
|
|
|
bool multiwrite;
|
2012-07-07 09:01:38 +02:00
|
|
|
bool dual_src_blend;
|
2012-07-07 07:15:04 +02:00
|
|
|
};
|
|
|
|
|
2012-09-10 21:38:09 +02:00
|
|
|
struct r600_clip_misc_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
unsigned pa_cl_clip_cntl; /* from rasterizer */
|
|
|
|
unsigned pa_cl_vs_out_cntl; /* from vertex shader */
|
|
|
|
unsigned clip_plane_enable; /* from rasterizer */
|
|
|
|
unsigned clip_dist_write; /* from vertex shader */
|
|
|
|
};
|
|
|
|
|
2012-07-18 03:45:25 +02:00
|
|
|
struct r600_alphatest_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
unsigned sx_alpha_test_control; /* this comes from dsa state */
|
|
|
|
unsigned sx_alpha_ref; /* this comes from dsa state */
|
|
|
|
bool bypass;
|
2012-07-18 04:17:11 +02:00
|
|
|
bool cb0_export_16bpc; /* from set_framebuffer_state */
|
2012-07-18 03:45:25 +02:00
|
|
|
};
|
|
|
|
|
2012-09-11 01:16:32 +02:00
|
|
|
struct r600_vgt_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
uint32_t vgt_multi_prim_ib_reset_en;
|
|
|
|
uint32_t vgt_multi_prim_ib_reset_indx;
|
|
|
|
uint32_t vgt_indx_offset;
|
|
|
|
};
|
|
|
|
|
2012-09-10 19:41:39 +02:00
|
|
|
struct r600_blend_color {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct pipe_blend_color state;
|
|
|
|
};
|
|
|
|
|
2012-09-10 20:03:09 +02:00
|
|
|
struct r600_clip_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct pipe_clip_state state;
|
|
|
|
};
|
|
|
|
|
2012-07-24 14:23:12 +00:00
|
|
|
struct r600_cs_shader_state {
|
|
|
|
struct r600_atom atom;
|
2012-09-13 14:59:50 +00:00
|
|
|
unsigned kernel_index;
|
2012-07-24 14:23:12 +00:00
|
|
|
struct r600_pipe_compute *shader;
|
|
|
|
};
|
|
|
|
|
2012-09-18 19:42:29 +02:00
|
|
|
struct r600_framebuffer {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct pipe_framebuffer_state state;
|
|
|
|
unsigned compressed_cb_mask;
|
|
|
|
unsigned nr_samples;
|
|
|
|
bool export_16bpc;
|
|
|
|
bool cb0_is_integer;
|
|
|
|
bool is_msaa_resolve;
|
|
|
|
};
|
|
|
|
|
2012-07-22 07:48:52 +02:00
|
|
|
struct r600_sample_mask {
|
|
|
|
struct r600_atom atom;
|
|
|
|
uint16_t sample_mask; /* there are only 8 bits on EG, 16 bits on Cayman */
|
|
|
|
};
|
|
|
|
|
2012-10-06 06:18:24 +02:00
|
|
|
struct r600_config_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
unsigned sq_gpr_resource_mgmt_1;
|
|
|
|
};
|
|
|
|
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_stencil_ref
|
|
|
|
{
|
|
|
|
ubyte ref_value[2];
|
|
|
|
ubyte valuemask[2];
|
|
|
|
ubyte writemask[2];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct r600_stencil_ref_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct r600_stencil_ref state;
|
|
|
|
struct pipe_stencil_ref pipe_state;
|
|
|
|
};
|
|
|
|
|
2012-09-10 19:28:34 +02:00
|
|
|
struct r600_viewport_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct pipe_viewport_state state;
|
|
|
|
};
|
|
|
|
|
2013-09-22 15:18:11 +02:00
|
|
|
/* This must start from 16. */
|
2013-09-22 13:06:27 +02:00
|
|
|
/* features */
|
2013-03-01 16:31:49 +01:00
|
|
|
#define DBG_NO_LLVM (1 << 17)
|
2013-03-05 01:15:45 +01:00
|
|
|
#define DBG_NO_CP_DMA (1 << 18)
|
|
|
|
#define DBG_NO_ASYNC_DMA (1 << 19)
|
2013-04-30 20:53:15 +04:00
|
|
|
/* shader backend */
|
2013-08-24 00:54:54 +04:00
|
|
|
#define DBG_NO_SB (1 << 21)
|
2013-04-30 20:53:15 +04:00
|
|
|
#define DBG_SB_CS (1 << 22)
|
|
|
|
#define DBG_SB_DRY_RUN (1 << 23)
|
|
|
|
#define DBG_SB_STAT (1 << 24)
|
|
|
|
#define DBG_SB_DUMP (1 << 25)
|
2013-04-23 10:34:00 +04:00
|
|
|
#define DBG_SB_NO_FALLBACK (1 << 26)
|
2013-05-03 12:01:20 +04:00
|
|
|
#define DBG_SB_DISASM (1 << 27)
|
2013-06-05 20:55:31 +04:00
|
|
|
#define DBG_SB_SAFEMATH (1 << 28)
|
2013-03-01 16:31:49 +01:00
|
|
|
|
2010-09-22 17:37:30 -04:00
|
|
|
struct r600_screen {
|
2013-08-13 21:49:59 +02:00
|
|
|
struct r600_common_screen b;
|
2012-10-12 18:46:32 +02:00
|
|
|
bool has_msaa;
|
2013-04-11 15:29:41 +02:00
|
|
|
bool has_compressed_msaa_texturing;
|
2011-12-30 10:45:31 +01:00
|
|
|
|
2011-11-30 22:20:41 +01:00
|
|
|
/*for compute global memory binding, we allocate stuff here, instead of
|
|
|
|
* buffers.
|
|
|
|
* XXX: Not sure if this is the best place for global_pool. Also,
|
|
|
|
* it's not thread safe, so it won't work with multiple contexts. */
|
|
|
|
struct compute_memory_pool *global_pool;
|
2010-09-22 17:37:30 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct r600_pipe_sampler_view {
|
|
|
|
struct pipe_sampler_view base;
|
2012-07-14 15:26:59 +02:00
|
|
|
struct r600_resource *tex_resource;
|
|
|
|
uint32_t tex_resource_words[8];
|
2012-10-12 18:46:32 +02:00
|
|
|
bool skip_mip_address_reloc;
|
2010-09-22 17:37:30 -04:00
|
|
|
};
|
|
|
|
|
2012-10-05 19:39:14 +02:00
|
|
|
struct r600_rasterizer_state {
|
|
|
|
struct r600_command_buffer buffer;
|
2011-06-08 08:05:40 -06:00
|
|
|
boolean flatshade;
|
2012-01-06 08:13:18 +04:00
|
|
|
boolean two_side;
|
2010-09-22 17:37:30 -04:00
|
|
|
unsigned sprite_coord_enable;
|
2012-01-15 09:29:50 -05:00
|
|
|
unsigned clip_plane_enable;
|
2012-01-29 05:22:00 +01:00
|
|
|
unsigned pa_sc_line_stipple;
|
2012-01-29 07:16:10 +01:00
|
|
|
unsigned pa_cl_clip_cntl;
|
2010-09-24 21:34:56 -04:00
|
|
|
float offset_units;
|
|
|
|
float offset_scale;
|
2012-10-05 04:59:50 +02:00
|
|
|
bool offset_enable;
|
2012-02-26 13:17:53 +01:00
|
|
|
bool scissor_enable;
|
2012-08-04 01:50:10 +02:00
|
|
|
bool multisample_enable;
|
2010-09-22 17:37:30 -04:00
|
|
|
};
|
|
|
|
|
2012-10-05 04:59:50 +02:00
|
|
|
struct r600_poly_offset_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
enum pipe_format zs_format;
|
|
|
|
float offset_units;
|
|
|
|
float offset_scale;
|
|
|
|
};
|
|
|
|
|
2012-10-05 02:45:29 +02:00
|
|
|
struct r600_blend_state {
|
|
|
|
struct r600_command_buffer buffer;
|
|
|
|
struct r600_command_buffer buffer_no_blend;
|
2010-09-22 17:37:30 -04:00
|
|
|
unsigned cb_target_mask;
|
2012-01-29 04:17:30 +01:00
|
|
|
unsigned cb_color_control;
|
2012-10-05 02:45:29 +02:00
|
|
|
unsigned cb_color_control_no_blend;
|
2012-03-24 13:37:16 +00:00
|
|
|
bool dual_src_blend;
|
2012-08-04 01:50:10 +02:00
|
|
|
bool alpha_to_one;
|
2010-09-22 17:37:30 -04:00
|
|
|
};
|
|
|
|
|
2012-10-05 20:11:15 +02:00
|
|
|
struct r600_dsa_state {
|
|
|
|
struct r600_command_buffer buffer;
|
2011-05-05 20:54:36 +02:00
|
|
|
unsigned alpha_ref;
|
2012-01-28 05:50:00 +01:00
|
|
|
ubyte valuemask[2];
|
|
|
|
ubyte writemask[2];
|
2013-02-20 16:20:17 -05:00
|
|
|
unsigned zwritemask;
|
|
|
|
unsigned sx_alpha_test_control;
|
2011-05-05 20:54:36 +02:00
|
|
|
};
|
|
|
|
|
2012-06-11 13:11:47 +04:00
|
|
|
struct r600_pipe_shader;
|
|
|
|
|
|
|
|
struct r600_pipe_shader_selector {
|
|
|
|
struct r600_pipe_shader *current;
|
|
|
|
|
|
|
|
struct tgsi_token *tokens;
|
|
|
|
struct pipe_stream_output_info so;
|
|
|
|
|
|
|
|
unsigned num_shaders;
|
|
|
|
|
|
|
|
/* PIPE_SHADER_[VERTEX|FRAGMENT|...] */
|
|
|
|
unsigned type;
|
|
|
|
|
2012-06-26 22:47:27 +04:00
|
|
|
unsigned nr_ps_max_color_exports;
|
2012-06-11 13:11:47 +04:00
|
|
|
};
|
|
|
|
|
2011-06-19 23:41:02 +02:00
|
|
|
struct r600_pipe_sampler_state {
|
2012-08-01 15:53:11 -04:00
|
|
|
uint32_t tex_sampler_words[3];
|
2012-10-14 03:53:09 +02:00
|
|
|
union pipe_color_union border_color;
|
2012-08-01 15:53:11 -04:00
|
|
|
bool border_color_use;
|
|
|
|
bool seamless_cube_map;
|
2011-06-19 23:41:02 +02:00
|
|
|
};
|
|
|
|
|
2010-10-12 13:24:01 +10:00
|
|
|
/* needed for blitter save */
|
2010-10-18 12:04:57 +10:00
|
|
|
#define NUM_TEX_UNITS 16
|
|
|
|
|
2012-08-01 15:53:11 -04:00
|
|
|
struct r600_seamless_cube_map {
|
|
|
|
struct r600_atom atom;
|
|
|
|
bool enabled;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct r600_samplerview_state {
|
2012-07-14 15:26:59 +02:00
|
|
|
struct r600_atom atom;
|
2010-12-09 16:16:22 -05:00
|
|
|
struct r600_pipe_sampler_view *views[NUM_TEX_UNITS];
|
2012-07-14 15:26:59 +02:00
|
|
|
uint32_t enabled_mask;
|
|
|
|
uint32_t dirty_mask;
|
2012-08-13 19:52:57 +02:00
|
|
|
uint32_t compressed_depthtex_mask; /* which textures are depth */
|
2012-08-12 20:06:33 +02:00
|
|
|
uint32_t compressed_colortex_mask;
|
2012-11-03 20:53:33 +10:00
|
|
|
boolean dirty_txq_constants;
|
2012-12-16 10:31:32 +00:00
|
|
|
boolean dirty_buffer_constants;
|
2012-07-14 15:26:59 +02:00
|
|
|
};
|
|
|
|
|
2012-09-10 04:06:20 +02:00
|
|
|
struct r600_sampler_states {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct r600_pipe_sampler_state *states[NUM_TEX_UNITS];
|
|
|
|
uint32_t enabled_mask;
|
|
|
|
uint32_t dirty_mask;
|
|
|
|
uint32_t has_bordercolor_mask; /* which states contain the border color */
|
|
|
|
};
|
|
|
|
|
2012-07-14 15:26:59 +02:00
|
|
|
struct r600_textures_info {
|
|
|
|
struct r600_samplerview_state views;
|
2012-09-10 04:06:20 +02:00
|
|
|
struct r600_sampler_states states;
|
2011-09-02 07:35:48 +02:00
|
|
|
bool is_array_sampler[NUM_TEX_UNITS];
|
2012-11-03 20:53:33 +10:00
|
|
|
|
|
|
|
/* cube array txq workaround */
|
|
|
|
uint32_t *txq_constants;
|
2012-12-16 10:31:32 +00:00
|
|
|
/* buffer related workarounds */
|
|
|
|
uint32_t *buffer_constants;
|
2010-10-12 13:24:01 +10:00
|
|
|
};
|
|
|
|
|
2012-04-01 22:03:15 +02:00
|
|
|
struct r600_constbuf_state
|
|
|
|
{
|
|
|
|
struct r600_atom atom;
|
2012-04-24 19:52:26 +02:00
|
|
|
struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS];
|
2012-04-01 22:03:15 +02:00
|
|
|
uint32_t enabled_mask;
|
|
|
|
uint32_t dirty_mask;
|
|
|
|
};
|
|
|
|
|
2012-07-12 19:50:28 +00:00
|
|
|
struct r600_vertexbuf_state
|
|
|
|
{
|
|
|
|
struct r600_atom atom;
|
2012-07-06 03:18:06 +02:00
|
|
|
struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
|
|
|
|
uint32_t enabled_mask; /* non-NULL buffers */
|
2012-07-12 19:50:28 +00:00
|
|
|
uint32_t dirty_mask;
|
|
|
|
};
|
|
|
|
|
2012-10-05 02:45:29 +02:00
|
|
|
/* CSO (constant state object, in other words, immutable state). */
|
|
|
|
struct r600_cso_state
|
|
|
|
{
|
|
|
|
struct r600_atom atom;
|
|
|
|
void *cso; /* e.g. r600_blend_state */
|
|
|
|
struct r600_command_buffer *cb;
|
|
|
|
};
|
|
|
|
|
2012-10-05 05:37:38 +02:00
|
|
|
struct r600_scissor_state
|
|
|
|
{
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct pipe_scissor_state scissor;
|
|
|
|
bool enable; /* r6xx only */
|
|
|
|
};
|
|
|
|
|
2012-12-09 18:51:31 +01:00
|
|
|
struct r600_fetch_shader {
|
|
|
|
struct r600_resource *buffer;
|
|
|
|
unsigned offset;
|
|
|
|
};
|
|
|
|
|
2013-02-28 17:27:36 +01:00
|
|
|
struct r600_shader_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
struct r600_pipe_shader_selector *shader;
|
|
|
|
};
|
|
|
|
|
2012-01-29 23:25:42 +01:00
|
|
|
struct r600_context {
|
2013-08-13 21:49:59 +02:00
|
|
|
struct r600_common_context b;
|
2012-10-05 16:51:41 +02:00
|
|
|
struct r600_screen *screen;
|
2010-09-26 16:27:36 -04:00
|
|
|
struct blitter_context *blitter;
|
2012-12-09 18:51:31 +01:00
|
|
|
struct u_suballocator *allocator_fetch_shader;
|
2013-06-30 18:29:17 +02:00
|
|
|
unsigned initial_gfx_cs_size;
|
2012-10-05 16:51:41 +02:00
|
|
|
|
|
|
|
/* Hardware info. */
|
2012-03-31 23:44:31 +02:00
|
|
|
boolean has_vertex_cache;
|
2012-09-18 19:42:29 +02:00
|
|
|
boolean keep_tiling_flags;
|
2012-10-05 16:51:41 +02:00
|
|
|
unsigned default_ps_gprs, default_vs_gprs;
|
2012-01-28 04:25:31 +01:00
|
|
|
unsigned r6xx_num_clause_temp_gprs;
|
2012-10-05 16:51:41 +02:00
|
|
|
|
|
|
|
/* Miscellaneous state objects. */
|
2010-09-26 16:27:36 -04:00
|
|
|
void *custom_dsa_flush;
|
2012-08-09 17:21:10 +02:00
|
|
|
void *custom_blend_resolve;
|
2012-08-12 20:06:33 +02:00
|
|
|
void *custom_blend_decompress;
|
2013-09-11 01:41:40 +02:00
|
|
|
void *custom_blend_fastclear;
|
2012-10-05 16:51:41 +02:00
|
|
|
/* With rasterizer discard, there doesn't have to be a pixel shader.
|
|
|
|
* In that case, we bind this one: */
|
|
|
|
void *dummy_pixel_shader;
|
|
|
|
/* These dummy CMASK and FMASK buffers are used to get around the R6xx hardware
|
|
|
|
* bug where valid CMASK and FMASK are required to be present to avoid
|
|
|
|
* a hardlock in certain operations but aren't actually used
|
|
|
|
* for anything useful. */
|
|
|
|
struct r600_resource *dummy_fmask;
|
|
|
|
struct r600_resource *dummy_cmask;
|
2012-08-09 17:21:10 +02:00
|
|
|
|
2012-10-05 16:51:41 +02:00
|
|
|
/* State binding slots are here. */
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_atom *atoms[R600_NUM_ATOMS];
|
|
|
|
/* States for CS initialization. */
|
2012-03-05 16:20:05 +01:00
|
|
|
struct r600_command_buffer start_cs_cmd; /* invariant state mostly */
|
2012-06-25 17:56:01 +00:00
|
|
|
/** Compute specific registers initializations. The start_cs_cmd atom
|
|
|
|
* must be emitted before start_compute_cs_cmd. */
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_command_buffer start_compute_cs_cmd;
|
|
|
|
/* Register states. */
|
2012-07-18 03:45:25 +02:00
|
|
|
struct r600_alphatest_state alphatest_state;
|
2012-10-05 02:45:29 +02:00
|
|
|
struct r600_cso_state blend_state;
|
2012-09-10 19:41:39 +02:00
|
|
|
struct r600_blend_color blend_color;
|
2012-07-07 07:15:04 +02:00
|
|
|
struct r600_cb_misc_state cb_misc_state;
|
2012-09-10 21:38:09 +02:00
|
|
|
struct r600_clip_misc_state clip_misc_state;
|
2012-09-10 20:03:09 +02:00
|
|
|
struct r600_clip_state clip_state;
|
2012-03-05 16:20:05 +01:00
|
|
|
struct r600_db_misc_state db_misc_state;
|
r600g: add htile support v16
htile is used for HiZ and HiS support and fast Z/S clears.
This commit just adds the htile setup and Fast Z clear.
We don't take full advantage of HiS with that patch.
v2 really use fast clear, still random issue with some tiles
need to try more flush combination, fix depth/stencil
texture decompression
v3 fix random issue on r6xx/r7xx
v4 rebase on top of lastest mesa, disable CB export when clearing
htile surface to avoid wasting bandwidth
v5 resummarize htile surface when uploading z value. Fix z/stencil
decompression, the custom blitter with custom dsa is no longer
needed.
v6 Reorganize render control/override update mecanism, fixing more
issues in the process.
v7 Add nop after depth surface base update to work around some htile
flushing issue. For htile to 8x8 on r6xx/r7xx as other combination
have issue. Do not enable hyperz when flushing/uncompressing
depth buffer.
v8 Fix htile surface, preload and prefetch setup. Only set preload
and prefetch on htile surface clear like fglrx. Record depth
clear value per level. Support several level for the htile
surface. First depth clear can't be a fast clear.
v9 Fix comments, properly account new register in emit function,
disable fast zclear if clearing different layer of texture
array to different value
v10 Disable hyperz for texture array making test simpler. Force
db_misc_state update when no depth buffer is bound. Remove
unused variable, rename depth_clearstencil to depth_clear.
Don't allocate htile surface for flushed depth. Something
broken the cliprect change, this need to be investigated.
v11 Rebase on top of newer mesa
v12 Rebase on top of newer mesa
v13 Rebase on top of newer mesa, htile surface need to be initialized
to zero, somehow special casing first clear to not use fast clear
and thus initialize the htile surface with proper value does not
work in all case.
v14 Use resource not texture for htile buffer make the htile buffer
size computation easier and simpler. Disable preload on evergreen
as its still troublesome in some case
v15 Cleanup some comment and remove some left over
v16 Define name for bit 20 of CP_COHER_CNTL
Signed-off-by: Pierre-Eric Pelloux-Prayer <pelloux@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
2012-10-11 10:40:30 -04:00
|
|
|
struct r600_db_state db_state;
|
2012-10-05 20:11:15 +02:00
|
|
|
struct r600_cso_state dsa_state;
|
2012-09-18 19:42:29 +02:00
|
|
|
struct r600_framebuffer framebuffer;
|
2012-10-05 04:59:50 +02:00
|
|
|
struct r600_poly_offset_state poly_offset_state;
|
2012-10-05 19:39:14 +02:00
|
|
|
struct r600_cso_state rasterizer_state;
|
2012-10-05 04:02:22 +02:00
|
|
|
struct r600_sample_mask sample_mask;
|
2012-10-05 05:37:38 +02:00
|
|
|
struct r600_scissor_state scissor;
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_seamless_cube_map seamless_cube_map;
|
2012-10-06 06:18:24 +02:00
|
|
|
struct r600_config_state config_state;
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_stencil_ref_state stencil_ref;
|
2012-09-11 01:16:32 +02:00
|
|
|
struct r600_vgt_state vgt_state;
|
2012-09-10 19:28:34 +02:00
|
|
|
struct r600_viewport_state viewport;
|
2012-09-10 19:10:46 +02:00
|
|
|
/* Shaders and shader resources. */
|
2012-10-05 04:02:22 +02:00
|
|
|
struct r600_cso_state vertex_fetch_shader;
|
2013-02-28 17:27:36 +01:00
|
|
|
struct r600_shader_state vertex_shader;
|
|
|
|
struct r600_shader_state pixel_shader;
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_cs_shader_state cs_shader_state;
|
|
|
|
struct r600_constbuf_state constbuf_state[PIPE_SHADER_TYPES];
|
|
|
|
struct r600_textures_info samplers[PIPE_SHADER_TYPES];
|
2012-07-12 19:50:27 +00:00
|
|
|
/** Vertex buffers for fetch shaders */
|
2012-07-12 19:50:28 +00:00
|
|
|
struct r600_vertexbuf_state vertex_buffer_state;
|
2012-07-12 19:50:27 +00:00
|
|
|
/** Vertex buffers for compute shaders */
|
2012-07-12 19:50:28 +00:00
|
|
|
struct r600_vertexbuf_state cs_vertex_buffer_state;
|
2012-01-30 01:23:14 +01:00
|
|
|
|
2012-10-05 16:51:41 +02:00
|
|
|
/* Additional context states. */
|
|
|
|
unsigned compute_cb_target_mask;
|
2013-02-28 17:27:36 +01:00
|
|
|
struct r600_pipe_shader_selector *ps_shader;
|
|
|
|
struct r600_pipe_shader_selector *vs_shader;
|
2012-10-05 19:39:14 +02:00
|
|
|
struct r600_rasterizer_state *rasterizer;
|
2012-10-05 16:51:41 +02:00
|
|
|
bool alpha_to_one;
|
|
|
|
bool force_blend_disable;
|
|
|
|
boolean dual_src_blend;
|
2013-02-20 16:20:17 -05:00
|
|
|
unsigned zwritemask;
|
2012-08-21 15:39:25 +04:00
|
|
|
|
2012-10-05 16:51:41 +02:00
|
|
|
/* Index buffer. */
|
|
|
|
struct pipe_index_buffer index_buffer;
|
2012-01-29 23:25:42 +01:00
|
|
|
|
2012-10-05 16:51:41 +02:00
|
|
|
/* Last draw state (-1 = unset). */
|
|
|
|
int last_primitive_type; /* Last primitive type used in draw_vbo. */
|
|
|
|
int last_start_instance;
|
2012-01-29 23:25:42 +01:00
|
|
|
|
2013-04-30 20:53:15 +04:00
|
|
|
void *sb_context;
|
2013-02-01 11:45:35 +04:00
|
|
|
struct r600_isa *isa;
|
2010-09-22 17:37:30 -04:00
|
|
|
};
|
|
|
|
|
2012-10-05 00:20:27 +02:00
|
|
|
static INLINE void r600_emit_command_buffer(struct radeon_winsys_cs *cs,
|
|
|
|
struct r600_command_buffer *cb)
|
|
|
|
{
|
|
|
|
assert(cs->cdw + cb->num_dw <= RADEON_MAX_CMDBUF_DWORDS);
|
|
|
|
memcpy(cs->buf + cs->cdw, cb->buf, 4 * cb->num_dw);
|
|
|
|
cs->cdw += cb->num_dw;
|
|
|
|
}
|
|
|
|
|
2012-12-19 12:23:50 -05:00
|
|
|
void r600_trace_emit(struct r600_context *rctx);
|
|
|
|
|
2012-01-30 01:23:14 +01:00
|
|
|
static INLINE void r600_emit_atom(struct r600_context *rctx, struct r600_atom *atom)
|
|
|
|
{
|
2013-08-13 21:49:59 +02:00
|
|
|
atom->emit(&rctx->b, atom);
|
2012-01-30 01:23:14 +01:00
|
|
|
atom->dirty = false;
|
2014-01-22 02:02:18 +01:00
|
|
|
if (rctx->screen->b.trace_bo) {
|
2012-12-19 12:23:50 -05:00
|
|
|
r600_trace_emit(rctx);
|
|
|
|
}
|
2012-01-30 01:23:14 +01:00
|
|
|
}
|
|
|
|
|
2012-10-05 02:45:29 +02:00
|
|
|
static INLINE void r600_set_cso_state(struct r600_cso_state *state, void *cso)
|
|
|
|
{
|
|
|
|
state->cso = cso;
|
|
|
|
state->atom.dirty = cso != NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static INLINE void r600_set_cso_state_with_cb(struct r600_cso_state *state, void *cso,
|
|
|
|
struct r600_command_buffer *cb)
|
|
|
|
{
|
|
|
|
state->cb = cb;
|
2013-11-03 20:27:28 +01:00
|
|
|
state->atom.num_dw = cb ? cb->num_dw : 0;
|
2012-10-05 02:45:29 +02:00
|
|
|
r600_set_cso_state(state, cso);
|
|
|
|
}
|
|
|
|
|
2013-03-03 14:33:00 +01:00
|
|
|
/* compute_memory_pool.c */
|
|
|
|
struct compute_memory_pool;
|
|
|
|
void compute_memory_pool_delete(struct compute_memory_pool* pool);
|
|
|
|
struct compute_memory_pool* compute_memory_pool_new(
|
|
|
|
struct r600_screen *rscreen);
|
|
|
|
|
2013-10-07 18:16:22 -06:00
|
|
|
/* evergreen_compute.c */
|
|
|
|
void evergreen_set_cs_sampler_view(struct pipe_context *ctx_,
|
|
|
|
unsigned start_slot, unsigned count,
|
|
|
|
struct pipe_sampler_view **views);
|
|
|
|
|
2010-09-22 17:37:30 -04:00
|
|
|
/* evergreen_state.c */
|
2012-09-23 23:12:17 +02:00
|
|
|
struct pipe_sampler_view *
|
|
|
|
evergreen_create_sampler_view_custom(struct pipe_context *ctx,
|
|
|
|
struct pipe_resource *texture,
|
|
|
|
const struct pipe_sampler_view *state,
|
|
|
|
unsigned width0, unsigned height0);
|
2012-08-20 14:44:39 +00:00
|
|
|
void evergreen_init_common_regs(struct r600_command_buffer *cb,
|
|
|
|
enum chip_class ctx_chip_class,
|
|
|
|
enum radeon_family ctx_family,
|
|
|
|
int ctx_drm_minor);
|
2012-10-23 12:24:45 -04:00
|
|
|
void cayman_init_common_regs(struct r600_command_buffer *cb,
|
|
|
|
enum chip_class ctx_chip_class,
|
|
|
|
enum radeon_family ctx_family,
|
|
|
|
int ctx_drm_minor);
|
2012-08-20 14:44:39 +00:00
|
|
|
|
2012-01-29 23:25:42 +01:00
|
|
|
void evergreen_init_state_functions(struct r600_context *rctx);
|
2012-01-31 10:50:51 +01:00
|
|
|
void evergreen_init_atom_start_cs(struct r600_context *rctx);
|
2013-03-01 18:42:52 +01:00
|
|
|
void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
|
|
|
void evergreen_update_vs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
2012-01-29 23:25:42 +01:00
|
|
|
void *evergreen_create_db_flush_dsa(struct r600_context *rctx);
|
2012-08-09 17:21:10 +02:00
|
|
|
void *evergreen_create_resolve_blend(struct r600_context *rctx);
|
2012-08-12 20:06:33 +02:00
|
|
|
void *evergreen_create_decompress_blend(struct r600_context *rctx);
|
2013-09-11 01:41:40 +02:00
|
|
|
void *evergreen_create_fastclear_blend(struct r600_context *rctx);
|
2011-07-05 01:58:46 +02:00
|
|
|
boolean evergreen_is_format_supported(struct pipe_screen *screen,
|
|
|
|
enum pipe_format format,
|
|
|
|
enum pipe_texture_target target,
|
|
|
|
unsigned sample_count,
|
|
|
|
unsigned usage);
|
2012-08-02 01:43:01 +02:00
|
|
|
void evergreen_init_color_surface(struct r600_context *rctx,
|
|
|
|
struct r600_surface *surf);
|
2012-09-25 17:46:18 +00:00
|
|
|
void evergreen_init_color_surface_rat(struct r600_context *rctx,
|
|
|
|
struct r600_surface *surf);
|
2012-10-06 06:05:32 +02:00
|
|
|
void evergreen_update_db_shader_control(struct r600_context * rctx);
|
2012-06-26 12:23:31 -04:00
|
|
|
|
2010-09-29 15:05:19 -04:00
|
|
|
/* r600_blit.c */
|
2012-01-29 23:25:42 +01:00
|
|
|
void r600_init_blit_functions(struct r600_context *rctx);
|
2012-08-13 19:52:57 +02:00
|
|
|
void r600_decompress_depth_textures(struct r600_context *rctx,
|
|
|
|
struct r600_samplerview_state *textures);
|
2012-08-12 20:06:33 +02:00
|
|
|
void r600_decompress_color_textures(struct r600_context *rctx,
|
|
|
|
struct r600_samplerview_state *textures);
|
2012-08-09 17:17:18 +02:00
|
|
|
|
2010-09-29 15:39:40 -04:00
|
|
|
/* r600_shader.c */
|
2012-09-17 23:22:00 +02:00
|
|
|
int r600_pipe_shader_create(struct pipe_context *ctx,
|
|
|
|
struct r600_pipe_shader *shader,
|
|
|
|
struct r600_shader_key key);
|
2013-06-12 12:36:08 -07:00
|
|
|
|
2010-10-23 13:33:18 +02:00
|
|
|
void r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
2010-09-29 15:39:40 -04:00
|
|
|
|
2010-09-29 15:05:19 -04:00
|
|
|
/* r600_state.c */
|
2012-09-23 23:12:17 +02:00
|
|
|
struct pipe_sampler_view *
|
|
|
|
r600_create_sampler_view_custom(struct pipe_context *ctx,
|
|
|
|
struct pipe_resource *texture,
|
|
|
|
const struct pipe_sampler_view *state,
|
|
|
|
unsigned width_first_level, unsigned height_first_level);
|
2012-01-29 23:25:42 +01:00
|
|
|
void r600_init_state_functions(struct r600_context *rctx);
|
2012-01-31 10:50:51 +01:00
|
|
|
void r600_init_atom_start_cs(struct r600_context *rctx);
|
2013-03-01 18:42:52 +01:00
|
|
|
void r600_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
|
|
|
void r600_update_vs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
2012-01-29 23:25:42 +01:00
|
|
|
void *r600_create_db_flush_dsa(struct r600_context *rctx);
|
2012-08-02 22:31:22 +02:00
|
|
|
void *r600_create_resolve_blend(struct r600_context *rctx);
|
2012-08-26 22:38:35 +02:00
|
|
|
void *r700_create_resolve_blend(struct r600_context *rctx);
|
2012-08-02 22:31:22 +02:00
|
|
|
void *r600_create_decompress_blend(struct r600_context *rctx);
|
2012-10-26 18:59:05 -04:00
|
|
|
bool r600_adjust_gprs(struct r600_context *rctx);
|
2011-07-05 01:58:46 +02:00
|
|
|
boolean r600_is_format_supported(struct pipe_screen *screen,
|
|
|
|
enum pipe_format format,
|
|
|
|
enum pipe_texture_target target,
|
|
|
|
unsigned sample_count,
|
|
|
|
unsigned usage);
|
2012-10-06 06:05:32 +02:00
|
|
|
void r600_update_db_shader_control(struct r600_context * rctx);
|
2010-12-03 12:20:40 -05:00
|
|
|
|
2013-02-26 17:20:25 +01:00
|
|
|
/* r600_hw_context.c */
|
2013-03-03 14:33:00 +01:00
|
|
|
void r600_context_flush(struct r600_context *ctx, unsigned flags);
|
|
|
|
void r600_begin_new_cs(struct r600_context *ctx);
|
|
|
|
void r600_flush_emit(struct r600_context *ctx);
|
|
|
|
void r600_need_cs_space(struct r600_context *ctx, unsigned num_dw, boolean count_draw_in);
|
|
|
|
void r600_need_dma_space(struct r600_context *ctx, unsigned num_dw);
|
|
|
|
void r600_cp_dma_copy_buffer(struct r600_context *rctx,
|
|
|
|
struct pipe_resource *dst, uint64_t dst_offset,
|
|
|
|
struct pipe_resource *src, uint64_t src_offset,
|
|
|
|
unsigned size);
|
2013-04-24 12:26:52 -04:00
|
|
|
void evergreen_cp_dma_clear_buffer(struct r600_context *rctx,
|
|
|
|
struct pipe_resource *dst, uint64_t offset,
|
|
|
|
unsigned size, uint32_t clear_value);
|
2013-03-03 14:33:00 +01:00
|
|
|
void r600_dma_copy(struct r600_context *rctx,
|
|
|
|
struct pipe_resource *dst,
|
|
|
|
struct pipe_resource *src,
|
|
|
|
uint64_t dst_offset,
|
|
|
|
uint64_t src_offset,
|
|
|
|
uint64_t size);
|
2013-02-26 17:20:25 +01:00
|
|
|
|
2013-03-03 14:21:34 +01:00
|
|
|
/*
|
|
|
|
* evergreen_hw_context.c
|
|
|
|
*/
|
2013-03-03 14:33:00 +01:00
|
|
|
void evergreen_dma_copy(struct r600_context *rctx,
|
|
|
|
struct pipe_resource *dst,
|
|
|
|
struct pipe_resource *src,
|
|
|
|
uint64_t dst_offset,
|
|
|
|
uint64_t src_offset,
|
|
|
|
uint64_t size);
|
2013-03-03 14:21:34 +01:00
|
|
|
|
2010-10-21 19:11:23 +10:00
|
|
|
/* r600_state_common.c */
|
2012-09-10 00:28:46 +02:00
|
|
|
void r600_init_common_state_functions(struct r600_context *rctx);
|
2012-10-05 02:45:29 +02:00
|
|
|
void r600_emit_cso_state(struct r600_context *rctx, struct r600_atom *atom);
|
2012-09-05 15:18:24 -04:00
|
|
|
void r600_emit_alphatest_state(struct r600_context *rctx, struct r600_atom *atom);
|
2012-09-10 19:41:39 +02:00
|
|
|
void r600_emit_blend_color(struct r600_context *rctx, struct r600_atom *atom);
|
2012-09-11 01:16:32 +02:00
|
|
|
void r600_emit_vgt_state(struct r600_context *rctx, struct r600_atom *atom);
|
2012-09-10 21:38:09 +02:00
|
|
|
void r600_emit_clip_misc_state(struct r600_context *rctx, struct r600_atom *atom);
|
2012-09-10 19:10:46 +02:00
|
|
|
void r600_emit_stencil_ref(struct r600_context *rctx, struct r600_atom *atom);
|
2012-09-10 19:28:34 +02:00
|
|
|
void r600_emit_viewport_state(struct r600_context *rctx, struct r600_atom *atom);
|
2013-02-28 17:27:36 +01:00
|
|
|
void r600_emit_shader(struct r600_context *rctx, struct r600_atom *a);
|
2012-09-05 15:18:24 -04:00
|
|
|
void r600_init_atom(struct r600_context *rctx, struct r600_atom *atom, unsigned id,
|
2012-02-02 14:01:12 +01:00
|
|
|
void (*emit)(struct r600_context *ctx, struct r600_atom *state),
|
2012-09-05 15:18:24 -04:00
|
|
|
unsigned num_dw);
|
2012-07-06 03:18:06 +02:00
|
|
|
void r600_vertex_buffers_dirty(struct r600_context *rctx);
|
2012-07-14 15:26:59 +02:00
|
|
|
void r600_sampler_views_dirty(struct r600_context *rctx,
|
|
|
|
struct r600_samplerview_state *state);
|
2012-09-10 04:06:20 +02:00
|
|
|
void r600_sampler_states_dirty(struct r600_context *rctx,
|
|
|
|
struct r600_sampler_states *state);
|
2012-04-01 22:03:15 +02:00
|
|
|
void r600_constant_buffers_dirty(struct r600_context *rctx, struct r600_constbuf_state *state);
|
2012-08-24 05:57:22 +02:00
|
|
|
void r600_draw_rectangle(struct blitter_context *blitter,
|
2012-09-12 23:37:17 +02:00
|
|
|
int x1, int y1, int x2, int y2, float depth,
|
2012-08-24 05:57:22 +02:00
|
|
|
enum blitter_attrib_type type, const union pipe_color_union *attrib);
|
2012-02-14 15:12:49 +01:00
|
|
|
uint32_t r600_translate_stencil_op(int s_op);
|
|
|
|
uint32_t r600_translate_fill(uint32_t func);
|
2012-02-14 15:19:27 +01:00
|
|
|
unsigned r600_tex_wrap(unsigned wrap);
|
|
|
|
unsigned r600_tex_filter(unsigned filter);
|
|
|
|
unsigned r600_tex_mipfilter(unsigned filter);
|
|
|
|
unsigned r600_tex_compare(unsigned compare);
|
2012-10-14 04:12:32 +02:00
|
|
|
bool sampler_state_needs_border_color(const struct pipe_sampler_state *state);
|
2013-09-21 20:50:33 +02:00
|
|
|
struct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe,
|
|
|
|
struct pipe_resource *texture,
|
|
|
|
const struct pipe_surface *templ,
|
|
|
|
unsigned width, unsigned height);
|
|
|
|
unsigned r600_get_swizzle_combined(const unsigned char *swizzle_format,
|
|
|
|
const unsigned char *swizzle_view,
|
|
|
|
boolean vtx);
|
|
|
|
uint32_t r600_translate_texformat(struct pipe_screen *screen, enum pipe_format format,
|
|
|
|
const unsigned char *swizzle_view,
|
|
|
|
uint32_t *word4_p, uint32_t *yuv_format_p);
|
2010-12-09 16:16:22 -05:00
|
|
|
|
2013-04-03 10:18:35 +02:00
|
|
|
/* r600_uvd.c */
|
2013-07-15 03:48:04 -06:00
|
|
|
struct pipe_video_codec *r600_uvd_create_decoder(struct pipe_context *context,
|
|
|
|
const struct pipe_video_codec *decoder);
|
2013-04-03 10:18:35 +02:00
|
|
|
|
|
|
|
struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe,
|
|
|
|
const struct pipe_video_buffer *tmpl);
|
|
|
|
|
2012-01-31 10:50:51 +01:00
|
|
|
/*
|
|
|
|
* Helpers for building command buffers
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define PKT3_SET_CONFIG_REG 0x68
|
|
|
|
#define PKT3_SET_CONTEXT_REG 0x69
|
2012-02-02 08:27:01 +01:00
|
|
|
#define PKT3_SET_CTL_CONST 0x6F
|
2012-02-03 05:05:31 +01:00
|
|
|
#define PKT3_SET_LOOP_CONST 0x6C
|
2012-01-31 10:50:51 +01:00
|
|
|
|
2012-02-02 08:27:01 +01:00
|
|
|
#define R600_CONFIG_REG_OFFSET 0x08000
|
2012-01-31 10:50:51 +01:00
|
|
|
#define R600_CONTEXT_REG_OFFSET 0x28000
|
2012-02-02 08:27:01 +01:00
|
|
|
#define R600_CTL_CONST_OFFSET 0x3CFF0
|
2012-02-03 05:05:31 +01:00
|
|
|
#define R600_LOOP_CONST_OFFSET 0X0003E200
|
2012-02-08 23:25:58 +01:00
|
|
|
#define EG_LOOP_CONST_OFFSET 0x0003A200
|
2012-01-31 10:50:51 +01:00
|
|
|
|
|
|
|
#define PKT_TYPE_S(x) (((x) & 0x3) << 30)
|
|
|
|
#define PKT_COUNT_S(x) (((x) & 0x3FFF) << 16)
|
|
|
|
#define PKT3_IT_OPCODE_S(x) (((x) & 0xFF) << 8)
|
|
|
|
#define PKT3_PREDICATE(x) (((x) >> 0) & 0x1)
|
|
|
|
#define PKT3(op, count, predicate) (PKT_TYPE_S(3) | PKT_COUNT_S(count) | PKT3_IT_OPCODE_S(op) | PKT3_PREDICATE(predicate))
|
|
|
|
|
2012-07-24 17:33:19 +00:00
|
|
|
#define RADEON_CP_PACKET3_COMPUTE_MODE 0x00000002
|
|
|
|
|
|
|
|
/*Evergreen Compute packet3*/
|
|
|
|
#define PKT3C(op, count, predicate) (PKT_TYPE_S(3) | PKT3_IT_OPCODE_S(op) | PKT_COUNT_S(count) | PKT3_PREDICATE(predicate) | RADEON_CP_PACKET3_COMPUTE_MODE)
|
|
|
|
|
2012-01-31 10:50:51 +01:00
|
|
|
static INLINE void r600_store_value(struct r600_command_buffer *cb, unsigned value)
|
|
|
|
{
|
2012-10-05 00:20:27 +02:00
|
|
|
cb->buf[cb->num_dw++] = value;
|
2012-01-31 10:50:51 +01:00
|
|
|
}
|
|
|
|
|
2013-03-02 17:14:51 +01:00
|
|
|
static INLINE void r600_store_array(struct r600_command_buffer *cb, unsigned num, unsigned *ptr)
|
|
|
|
{
|
|
|
|
assert(cb->num_dw+num <= cb->max_num_dw);
|
|
|
|
memcpy(&cb->buf[cb->num_dw], ptr, num * sizeof(ptr[0]));
|
|
|
|
cb->num_dw += num;
|
|
|
|
}
|
|
|
|
|
2012-01-31 10:50:51 +01:00
|
|
|
static INLINE void r600_store_config_reg_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
|
|
|
{
|
|
|
|
assert(reg < R600_CONTEXT_REG_OFFSET);
|
2012-10-05 00:20:27 +02:00
|
|
|
assert(cb->num_dw+2+num <= cb->max_num_dw);
|
|
|
|
cb->buf[cb->num_dw++] = PKT3(PKT3_SET_CONFIG_REG, num, 0);
|
|
|
|
cb->buf[cb->num_dw++] = (reg - R600_CONFIG_REG_OFFSET) >> 2;
|
2012-01-31 10:50:51 +01:00
|
|
|
}
|
|
|
|
|
2012-06-25 20:00:47 +00:00
|
|
|
/**
|
|
|
|
* Needs cb->pkt_flags set to RADEON_CP_PACKET3_COMPUTE_MODE for compute
|
|
|
|
* shaders.
|
|
|
|
*/
|
2012-01-31 10:50:51 +01:00
|
|
|
static INLINE void r600_store_context_reg_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
|
|
|
{
|
2012-02-02 08:27:01 +01:00
|
|
|
assert(reg >= R600_CONTEXT_REG_OFFSET && reg < R600_CTL_CONST_OFFSET);
|
2012-10-05 00:20:27 +02:00
|
|
|
assert(cb->num_dw+2+num <= cb->max_num_dw);
|
|
|
|
cb->buf[cb->num_dw++] = PKT3(PKT3_SET_CONTEXT_REG, num, 0) | cb->pkt_flags;
|
|
|
|
cb->buf[cb->num_dw++] = (reg - R600_CONTEXT_REG_OFFSET) >> 2;
|
2012-01-31 10:50:51 +01:00
|
|
|
}
|
|
|
|
|
2012-06-25 20:00:47 +00:00
|
|
|
/**
|
|
|
|
* Needs cb->pkt_flags set to RADEON_CP_PACKET3_COMPUTE_MODE for compute
|
|
|
|
* shaders.
|
|
|
|
*/
|
2012-02-02 08:27:01 +01:00
|
|
|
static INLINE void r600_store_ctl_const_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
|
|
|
{
|
|
|
|
assert(reg >= R600_CTL_CONST_OFFSET);
|
2012-10-05 00:20:27 +02:00
|
|
|
assert(cb->num_dw+2+num <= cb->max_num_dw);
|
|
|
|
cb->buf[cb->num_dw++] = PKT3(PKT3_SET_CTL_CONST, num, 0) | cb->pkt_flags;
|
|
|
|
cb->buf[cb->num_dw++] = (reg - R600_CTL_CONST_OFFSET) >> 2;
|
2012-02-02 08:27:01 +01:00
|
|
|
}
|
|
|
|
|
2012-02-03 05:05:31 +01:00
|
|
|
static INLINE void r600_store_loop_const_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
|
|
|
{
|
|
|
|
assert(reg >= R600_LOOP_CONST_OFFSET);
|
2012-10-05 00:20:27 +02:00
|
|
|
assert(cb->num_dw+2+num <= cb->max_num_dw);
|
|
|
|
cb->buf[cb->num_dw++] = PKT3(PKT3_SET_LOOP_CONST, num, 0);
|
|
|
|
cb->buf[cb->num_dw++] = (reg - R600_LOOP_CONST_OFFSET) >> 2;
|
2012-02-03 05:05:31 +01:00
|
|
|
}
|
|
|
|
|
2012-06-25 20:00:47 +00:00
|
|
|
/**
|
|
|
|
* Needs cb->pkt_flags set to RADEON_CP_PACKET3_COMPUTE_MODE for compute
|
|
|
|
* shaders.
|
|
|
|
*/
|
2012-02-08 23:25:58 +01:00
|
|
|
static INLINE void eg_store_loop_const_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
|
|
|
{
|
|
|
|
assert(reg >= EG_LOOP_CONST_OFFSET);
|
2012-10-05 00:20:27 +02:00
|
|
|
assert(cb->num_dw+2+num <= cb->max_num_dw);
|
|
|
|
cb->buf[cb->num_dw++] = PKT3(PKT3_SET_LOOP_CONST, num, 0) | cb->pkt_flags;
|
|
|
|
cb->buf[cb->num_dw++] = (reg - EG_LOOP_CONST_OFFSET) >> 2;
|
2012-02-08 23:25:58 +01:00
|
|
|
}
|
|
|
|
|
2012-01-31 10:50:51 +01:00
|
|
|
static INLINE void r600_store_config_reg(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
|
|
|
{
|
|
|
|
r600_store_config_reg_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
static INLINE void r600_store_context_reg(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
|
|
|
{
|
|
|
|
r600_store_context_reg_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2012-02-02 08:27:01 +01:00
|
|
|
static INLINE void r600_store_ctl_const(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
|
|
|
{
|
|
|
|
r600_store_ctl_const_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2012-02-03 05:05:31 +01:00
|
|
|
static INLINE void r600_store_loop_const(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
|
|
|
{
|
|
|
|
r600_store_loop_const_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2012-02-08 23:25:58 +01:00
|
|
|
static INLINE void eg_store_loop_const(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
|
|
|
{
|
|
|
|
eg_store_loop_const_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2012-10-05 00:20:27 +02:00
|
|
|
void r600_init_command_buffer(struct r600_command_buffer *cb, unsigned num_dw);
|
2012-01-31 10:50:51 +01:00
|
|
|
void r600_release_command_buffer(struct r600_command_buffer *cb);
|
|
|
|
|
2012-07-24 17:33:19 +00:00
|
|
|
static INLINE void r600_write_compute_context_reg_seq(struct radeon_winsys_cs *cs, unsigned reg, unsigned num)
|
|
|
|
{
|
|
|
|
r600_write_context_reg_seq(cs, reg, num);
|
|
|
|
/* Set the compute bit on the packet header */
|
|
|
|
cs->buf[cs->cdw - 2] |= RADEON_CP_PACKET3_COMPUTE_MODE;
|
|
|
|
}
|
|
|
|
|
2012-02-02 14:01:12 +01:00
|
|
|
static INLINE void r600_write_ctl_const_seq(struct radeon_winsys_cs *cs, unsigned reg, unsigned num)
|
|
|
|
{
|
|
|
|
assert(reg >= R600_CTL_CONST_OFFSET);
|
|
|
|
assert(cs->cdw+2+num <= RADEON_MAX_CMDBUF_DWORDS);
|
|
|
|
cs->buf[cs->cdw++] = PKT3(PKT3_SET_CTL_CONST, num, 0);
|
|
|
|
cs->buf[cs->cdw++] = (reg - R600_CTL_CONST_OFFSET) >> 2;
|
|
|
|
}
|
|
|
|
|
2012-07-24 17:33:19 +00:00
|
|
|
static INLINE void r600_write_compute_context_reg(struct radeon_winsys_cs *cs, unsigned reg, unsigned value)
|
|
|
|
{
|
|
|
|
r600_write_compute_context_reg_seq(cs, reg, 1);
|
2013-08-13 21:49:59 +02:00
|
|
|
radeon_emit(cs, value);
|
2012-02-02 14:01:12 +01:00
|
|
|
}
|
|
|
|
|
2013-04-22 20:06:54 -07:00
|
|
|
static INLINE void r600_write_context_reg_flag(struct radeon_winsys_cs *cs, unsigned reg, unsigned value, unsigned flag)
|
|
|
|
{
|
|
|
|
if (flag & RADEON_CP_PACKET3_COMPUTE_MODE) {
|
|
|
|
r600_write_compute_context_reg(cs, reg, value);
|
|
|
|
} else {
|
|
|
|
r600_write_context_reg(cs, reg, value);
|
|
|
|
}
|
|
|
|
}
|
2013-08-13 21:49:59 +02:00
|
|
|
|
2012-02-02 14:01:12 +01:00
|
|
|
static INLINE void r600_write_ctl_const(struct radeon_winsys_cs *cs, unsigned reg, unsigned value)
|
|
|
|
{
|
|
|
|
r600_write_ctl_const_seq(cs, reg, 1);
|
2013-08-13 21:49:59 +02:00
|
|
|
radeon_emit(cs, value);
|
2012-02-02 14:01:12 +01:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:39:40 -04:00
|
|
|
/*
|
|
|
|
* common helpers
|
|
|
|
*/
|
2012-01-29 23:13:39 +01:00
|
|
|
static INLINE uint32_t S_FIXED(float value, uint32_t frac_bits)
|
2010-09-29 15:39:40 -04:00
|
|
|
{
|
|
|
|
return value * (1 << frac_bits);
|
|
|
|
}
|
|
|
|
#define ALIGN_DIVUP(x, y) (((x) + (y) - 1) / (y))
|
2010-09-29 14:26:29 -04:00
|
|
|
|
2011-05-09 12:09:51 -04:00
|
|
|
static inline unsigned r600_tex_aniso_filter(unsigned filter)
|
|
|
|
{
|
|
|
|
if (filter <= 1) return 0;
|
|
|
|
if (filter <= 2) return 1;
|
|
|
|
if (filter <= 4) return 2;
|
|
|
|
if (filter <= 8) return 3;
|
|
|
|
/* else */ return 4;
|
|
|
|
}
|
|
|
|
|
2012-01-27 21:20:27 +01:00
|
|
|
/* 12.4 fixed-point */
|
|
|
|
static INLINE unsigned r600_pack_float_12p4(float x)
|
|
|
|
{
|
|
|
|
return x <= 0 ? 0 :
|
|
|
|
x >= 4096 ? 0xffff : x * 16;
|
|
|
|
}
|
|
|
|
|
2010-09-22 17:37:30 -04:00
|
|
|
#endif
|