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
|
|
|
|
|
2017-09-13 02:26:26 +02:00
|
|
|
#include "r600_pipe_common.h"
|
|
|
|
#include "r600_cs.h"
|
2013-08-13 21:49:59 +02:00
|
|
|
#include "r600_public.h"
|
2017-04-02 20:33:04 +03:00
|
|
|
#include "pipe/p_defines.h"
|
2013-08-13 21:49:59 +02:00
|
|
|
|
2012-12-09 17:56:26 +01:00
|
|
|
#include "util/u_suballoc.h"
|
2015-04-27 17:41:27 -07:00
|
|
|
#include "util/list.h"
|
2013-03-03 14:33:00 +01:00
|
|
|
#include "util/u_transfer.h"
|
2016-04-26 07:59:44 +10:00
|
|
|
#include "util/u_memory.h"
|
2010-09-29 14:26:29 -04:00
|
|
|
|
2015-08-29 18:31:08 +10:00
|
|
|
#include "tgsi/tgsi_scan.h"
|
|
|
|
|
2017-11-03 11:11:15 +10:00
|
|
|
#define R600_NUM_ATOMS 56
|
2017-11-15 09:59:42 +10:00
|
|
|
|
|
|
|
#define R600_MAX_IMAGES 8
|
|
|
|
/*
|
|
|
|
* ranges reserved for images on evergreen
|
|
|
|
* first set for the immediate buffers,
|
|
|
|
* second for the actual resources for RESQ.
|
|
|
|
*/
|
|
|
|
#define R600_IMAGE_IMMED_RESOURCE_OFFSET 160
|
|
|
|
#define R600_IMAGE_REAL_RESOURCE_OFFSET 168
|
2012-09-05 15:18:24 -04:00
|
|
|
|
2014-12-29 13:39:42 +01:00
|
|
|
/* read caches */
|
|
|
|
#define R600_CONTEXT_INV_VERTEX_CACHE (R600_CONTEXT_PRIVATE_FLAG << 0)
|
|
|
|
#define R600_CONTEXT_INV_TEX_CACHE (R600_CONTEXT_PRIVATE_FLAG << 1)
|
|
|
|
#define R600_CONTEXT_INV_CONST_CACHE (R600_CONTEXT_PRIVATE_FLAG << 2)
|
|
|
|
/* read-write caches */
|
|
|
|
#define R600_CONTEXT_FLUSH_AND_INV (R600_CONTEXT_PRIVATE_FLAG << 3)
|
|
|
|
#define R600_CONTEXT_FLUSH_AND_INV_CB_META (R600_CONTEXT_PRIVATE_FLAG << 4)
|
|
|
|
#define R600_CONTEXT_FLUSH_AND_INV_DB_META (R600_CONTEXT_PRIVATE_FLAG << 5)
|
|
|
|
#define R600_CONTEXT_FLUSH_AND_INV_DB (R600_CONTEXT_PRIVATE_FLAG << 6)
|
|
|
|
#define R600_CONTEXT_FLUSH_AND_INV_CB (R600_CONTEXT_PRIVATE_FLAG << 7)
|
|
|
|
/* engine synchronization */
|
|
|
|
#define R600_CONTEXT_PS_PARTIAL_FLUSH (R600_CONTEXT_PRIVATE_FLAG << 8)
|
|
|
|
#define R600_CONTEXT_WAIT_3D_IDLE (R600_CONTEXT_PRIVATE_FLAG << 9)
|
|
|
|
#define R600_CONTEXT_WAIT_CP_DMA_IDLE (R600_CONTEXT_PRIVATE_FLAG << 10)
|
2017-12-04 05:31:46 +10:00
|
|
|
#define R600_CONTEXT_CS_PARTIAL_FLUSH (R600_CONTEXT_PRIVATE_FLAG << 11)
|
2014-12-29 13:39:42 +01:00
|
|
|
|
2013-03-03 14:21:34 +01:00
|
|
|
/* the number of CS dwords for flushing and drawing */
|
2016-04-08 21:10:58 +02:00
|
|
|
#define R600_MAX_FLUSH_CS_DWORDS 18
|
2015-11-30 14:56:10 +10:00
|
|
|
#define R600_MAX_DRAW_CS_DWORDS 58
|
2016-05-26 22:00:03 +02:00
|
|
|
#define R600_MAX_PFP_SYNC_ME_DWORDS 16
|
2013-03-03 14:21:34 +01:00
|
|
|
|
2018-01-01 04:20:41 +01:00
|
|
|
#define EG_MAX_ATOMIC_BUFFERS 8
|
|
|
|
|
2018-01-03 02:09:01 +01:00
|
|
|
#define R600_MAX_USER_CONST_BUFFERS 15
|
2015-11-30 14:56:10 +10: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)
|
2018-01-01 04:20:41 +01:00
|
|
|
#define R600_MAX_HW_CONST_BUFFERS 16
|
2017-11-02 10:26:51 +10:00
|
|
|
|
2012-11-06 15:31:41 +10:00
|
|
|
/* start driver buffers after user buffers */
|
2015-09-11 04:43:53 +01:00
|
|
|
#define R600_BUFFER_INFO_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS)
|
|
|
|
#define R600_UCP_SIZE (4*4*8)
|
2017-11-28 12:53:02 +10:00
|
|
|
#define R600_CS_BLOCK_GRID_SIZE (8 * 4)
|
2018-01-03 02:09:01 +01:00
|
|
|
#define R600_TCS_DEFAULT_LEVELS_SIZE (6 * 4)
|
2015-09-11 04:43:53 +01:00
|
|
|
#define R600_BUFFER_INFO_OFFSET (R600_UCP_SIZE)
|
|
|
|
|
2018-01-03 02:09:01 +01:00
|
|
|
/*
|
|
|
|
* We only access this buffer through vtx clauses hence it's fine to exist
|
|
|
|
* at index beyond 15.
|
|
|
|
*/
|
2015-11-30 14:56:10 +10:00
|
|
|
#define R600_LDS_INFO_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 1)
|
|
|
|
/*
|
|
|
|
* Note GS doesn't use a constant buffer binding, just a resource index,
|
2018-01-03 02:09:01 +01:00
|
|
|
* so it's fine to have it exist at index beyond 15. I.e. it's not actually
|
2018-01-01 04:20:41 +01:00
|
|
|
* a const buffer, just a buffer resource.
|
2015-11-30 14:56:10 +10:00
|
|
|
*/
|
|
|
|
#define R600_GS_RING_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 2)
|
2014-11-24 12:53:40 +10:00
|
|
|
/* Currently R600_MAX_CONST_BUFFERS just fits on the hw, which has a limit
|
|
|
|
* of 16 const buffers.
|
2014-09-10 11:54:40 +02:00
|
|
|
* UCP/SAMPLE_POSITIONS are never accessed by same shader stage so they can use the same id.
|
|
|
|
*
|
2014-11-24 12:53:40 +10:00
|
|
|
* In order to support d3d 11 mandated minimum of 15 user const buffers
|
|
|
|
* we'd have to squash all use cases into one driver buffer.
|
2014-09-10 11:54:40 +02:00
|
|
|
*/
|
2014-07-24 20:32:08 +02:00
|
|
|
#define R600_MAX_CONST_BUFFER_SIZE (4096 * sizeof(float[4]))
|
2011-02-07 15:22:08 +01:00
|
|
|
|
2015-11-30 13:12:45 +10:00
|
|
|
/* HW stages */
|
|
|
|
#define R600_HW_STAGE_PS 0
|
|
|
|
#define R600_HW_STAGE_VS 1
|
|
|
|
#define R600_HW_STAGE_GS 2
|
|
|
|
#define R600_HW_STAGE_ES 3
|
|
|
|
#define EG_HW_STAGE_LS 4
|
|
|
|
#define EG_HW_STAGE_HS 5
|
|
|
|
|
|
|
|
#define R600_NUM_HW_STAGES 4
|
|
|
|
#define EG_NUM_HW_STAGES 6
|
|
|
|
|
2013-03-03 14:33:00 +01:00
|
|
|
struct r600_context;
|
2012-10-16 14:38:54 +00:00
|
|
|
struct r600_bytecode;
|
2015-08-19 18:58:47 +10:00
|
|
|
union r600_shader_key;
|
2012-10-12 18:30:51 +02:00
|
|
|
|
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;
|
2016-04-08 20:41:52 +02:00
|
|
|
bool occlusion_queries_disabled;
|
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
|
|
|
bool flush_depthstencil_through_cb;
|
2015-09-06 17:37:38 +02:00
|
|
|
bool flush_depth_inplace;
|
|
|
|
bool flush_stencil_inplace;
|
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
|
|
|
bool copy_depth, copy_stencil;
|
|
|
|
unsigned copy_sample;
|
|
|
|
unsigned log_samples;
|
|
|
|
unsigned db_shader_control;
|
|
|
|
bool htile_clear;
|
2015-10-17 16:53:28 +02:00
|
|
|
uint8_t ps_conservative_z;
|
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;
|
2018-01-19 13:20:36 +10:00
|
|
|
unsigned image_rat_enabled_mask;
|
|
|
|
unsigned buffer_rat_enabled_mask;
|
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 */
|
2016-05-13 14:35:33 +10:00
|
|
|
unsigned cc_dist_mask; /* from vertex shader */
|
2012-09-10 21:38:09 +02:00
|
|
|
unsigned clip_dist_write; /* from vertex shader */
|
2016-05-13 14:35:33 +10:00
|
|
|
unsigned cull_dist_write; /* from vertex shader */
|
2014-05-17 01:20:20 +02:00
|
|
|
boolean clip_disable; /* from vertex shader */
|
2015-12-19 23:01:22 +00:00
|
|
|
boolean vs_out_viewport; /* from vertex shader */
|
2012-09-10 21:38:09 +02:00
|
|
|
};
|
|
|
|
|
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;
|
2015-02-24 15:59:16 +01:00
|
|
|
bool last_draw_was_indirect;
|
2012-09-11 01:16:32 +02:00
|
|
|
};
|
|
|
|
|
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;
|
2014-09-25 18:10:44 -07:00
|
|
|
unsigned pc;
|
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;
|
2016-01-26 13:35:08 +10:00
|
|
|
bool dual_src_blend;
|
2017-04-13 23:56:28 +03:00
|
|
|
bool do_update_surf_dirtiness;
|
2012-09-18 19:42:29 +02:00
|
|
|
};
|
|
|
|
|
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;
|
2014-01-30 04:19:57 +00:00
|
|
|
unsigned sq_gpr_resource_mgmt_2;
|
2015-11-30 15:22:06 +10:00
|
|
|
unsigned sq_gpr_resource_mgmt_3;
|
|
|
|
bool dyn_gpr_enabled;
|
2012-10-06 06:18:24 +02:00
|
|
|
};
|
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2013-08-02 06:38:23 +04:00
|
|
|
struct r600_shader_stages_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
unsigned geom_enable;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct r600_gs_rings_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
unsigned enable;
|
|
|
|
struct pipe_constant_buffer esgs_ring;
|
|
|
|
struct pipe_constant_buffer gsvs_ring;
|
|
|
|
};
|
|
|
|
|
2013-09-22 15:18:11 +02:00
|
|
|
/* This must start from 16. */
|
2013-09-22 13:06:27 +02:00
|
|
|
/* features */
|
2014-09-06 17:07:50 +02:00
|
|
|
#define DBG_NO_CP_DMA (1 << 30)
|
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;
|
2017-11-02 10:26:51 +10:00
|
|
|
bool has_atomics;
|
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;
|
2014-08-11 13:32:40 +02:00
|
|
|
struct list_head list;
|
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;
|
2015-09-06 17:37:38 +02:00
|
|
|
bool is_stencil_sampler;
|
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;
|
2014-04-20 15:19:43 +02:00
|
|
|
unsigned pa_su_sc_mode_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;
|
2016-06-14 23:13:26 +02:00
|
|
|
bool offset_units_unscaled;
|
2012-02-26 13:17:53 +01:00
|
|
|
bool scissor_enable;
|
2012-08-04 01:50:10 +02:00
|
|
|
bool multisample_enable;
|
2016-08-26 17:26:43 +02:00
|
|
|
bool clip_halfz;
|
2017-04-10 23:04:36 +03:00
|
|
|
bool rasterizer_discard;
|
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;
|
2016-06-14 23:13:26 +02:00
|
|
|
bool offset_units_unscaled;
|
2012-10-05 04:59:50 +02:00
|
|
|
};
|
|
|
|
|
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;
|
2015-08-29 18:31:08 +10:00
|
|
|
struct tgsi_shader_info info;
|
2012-06-11 13:11:47 +04:00
|
|
|
|
|
|
|
unsigned num_shaders;
|
|
|
|
|
2017-04-02 20:33:04 +03:00
|
|
|
enum pipe_shader_type type;
|
2012-06-11 13:11:47 +04:00
|
|
|
|
2015-08-29 18:31:07 +10:00
|
|
|
/* geometry shader properties */
|
2017-04-02 20:33:05 +03:00
|
|
|
enum pipe_prim_type gs_output_prim;
|
|
|
|
unsigned gs_max_out_vertices;
|
|
|
|
unsigned gs_num_invocations;
|
2015-08-29 18:31:07 +10:00
|
|
|
|
2015-11-30 14:44:30 +10:00
|
|
|
/* TCS/VS */
|
|
|
|
uint64_t lds_patch_outputs_written_mask;
|
|
|
|
uint64_t lds_outputs_written_mask;
|
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-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];
|
2015-09-11 04:43:53 +01:00
|
|
|
};
|
2012-11-03 20:53:33 +10:00
|
|
|
|
2015-09-11 04:43:53 +01:00
|
|
|
struct r600_shader_driver_constants_info {
|
|
|
|
/* currently 128 bytes for UCP/samplepos + sampler buffer constants */
|
|
|
|
uint32_t *constants;
|
|
|
|
uint32_t alloc_size;
|
|
|
|
bool texture_const_dirty;
|
2018-01-03 02:09:01 +01:00
|
|
|
bool vs_ucp_dirty;
|
2015-09-11 04:43:53 +01:00
|
|
|
bool ps_sample_pos_dirty;
|
2017-11-28 12:53:02 +10:00
|
|
|
bool cs_block_grid_size_dirty;
|
2018-01-03 02:09:01 +01:00
|
|
|
bool tcs_default_levels_dirty;
|
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-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;
|
2013-08-02 06:38:23 +04:00
|
|
|
struct r600_pipe_shader *shader;
|
2013-02-28 17:27:36 +01:00
|
|
|
};
|
|
|
|
|
2017-11-02 10:26:51 +10:00
|
|
|
struct r600_atomic_buffer_state {
|
|
|
|
uint32_t enabled_mask;
|
|
|
|
uint32_t dirty_mask;
|
|
|
|
struct pipe_shader_buffer buffer[EG_MAX_ATOMIC_BUFFERS];
|
|
|
|
};
|
|
|
|
|
2017-11-15 09:59:42 +10:00
|
|
|
struct r600_image_view {
|
|
|
|
struct pipe_image_view base;
|
|
|
|
uint32_t cb_color_base;
|
|
|
|
uint32_t cb_color_pitch;
|
|
|
|
uint32_t cb_color_slice;
|
|
|
|
uint32_t cb_color_view;
|
|
|
|
uint32_t cb_color_info;
|
|
|
|
uint32_t cb_color_attrib;
|
|
|
|
uint32_t cb_color_dim;
|
|
|
|
uint32_t cb_color_fmask;
|
|
|
|
uint32_t cb_color_fmask_slice;
|
|
|
|
uint32_t immed_resource_words[8];
|
|
|
|
uint32_t resource_words[8];
|
|
|
|
bool skip_mip_address_reloc;
|
|
|
|
uint32_t buf_size;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct r600_image_state {
|
|
|
|
struct r600_atom atom;
|
|
|
|
uint32_t enabled_mask;
|
|
|
|
uint32_t dirty_mask;
|
|
|
|
uint32_t compressed_depthtex_mask;
|
|
|
|
uint32_t compressed_colortex_mask;
|
|
|
|
boolean dirty_buffer_constants;
|
|
|
|
struct r600_image_view views[R600_MAX_IMAGES];
|
|
|
|
};
|
|
|
|
|
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;
|
2012-10-05 16:51:41 +02:00
|
|
|
|
|
|
|
/* Hardware info. */
|
2012-03-31 23:44:31 +02:00
|
|
|
boolean has_vertex_cache;
|
2015-11-30 13:15:57 +10:00
|
|
|
unsigned default_gprs[EG_NUM_HW_STAGES];
|
2015-11-30 15:22:06 +10:00
|
|
|
unsigned current_gprs[EG_NUM_HW_STAGES];
|
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;
|
2017-04-12 17:45:30 +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;
|
2012-10-05 16:51:41 +02:00
|
|
|
/* 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];
|
2015-08-10 00:42:35 +03:00
|
|
|
/* Dirty atom bitmask for fast tests */
|
2015-09-03 01:54:31 +03:00
|
|
|
uint64_t dirty_atoms;
|
2012-09-10 19:10:46 +02:00
|
|
|
/* 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-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;
|
2017-11-02 10:26:51 +10:00
|
|
|
struct r600_atomic_buffer_state atomic_buffer_state;
|
2017-11-15 09:59:42 +10:00
|
|
|
/* only have images on fragment shader */
|
|
|
|
struct r600_image_state fragment_images;
|
2017-11-03 11:11:15 +10:00
|
|
|
struct r600_image_state compute_images;
|
2017-11-03 10:15:38 +10:00
|
|
|
struct r600_image_state fragment_buffers;
|
2017-11-03 11:11:15 +10:00
|
|
|
struct r600_image_state compute_buffers;
|
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;
|
2015-11-30 13:27:22 +10:00
|
|
|
struct r600_shader_state hw_shader_stages[EG_NUM_HW_STAGES];
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_cs_shader_state cs_shader_state;
|
2013-08-02 06:38:23 +04:00
|
|
|
struct r600_shader_stages_state shader_stages;
|
|
|
|
struct r600_gs_rings_state gs_rings;
|
2012-09-10 19:10:46 +02:00
|
|
|
struct r600_constbuf_state constbuf_state[PIPE_SHADER_TYPES];
|
|
|
|
struct r600_textures_info samplers[PIPE_SHADER_TYPES];
|
2015-09-11 04:43:53 +01:00
|
|
|
|
|
|
|
struct r600_shader_driver_constants_info driver_consts[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;
|
2013-08-02 06:38:23 +04:00
|
|
|
struct r600_pipe_shader_selector *gs_shader;
|
2015-11-30 10:45:19 +10:00
|
|
|
|
|
|
|
struct r600_pipe_shader_selector *tcs_shader;
|
|
|
|
struct r600_pipe_shader_selector *tes_shader;
|
|
|
|
|
2015-11-30 15:06:23 +10:00
|
|
|
struct r600_pipe_shader_selector *fixed_func_tcs_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;
|
2017-11-13 14:10:25 +10:00
|
|
|
bool gs_tri_strip_adj_fix;
|
2012-10-05 16:51:41 +02:00
|
|
|
boolean dual_src_blend;
|
2013-02-20 16:20:17 -05:00
|
|
|
unsigned zwritemask;
|
2014-09-10 11:54:40 +02:00
|
|
|
int ps_iter_samples;
|
2012-08-21 15:39:25 +04:00
|
|
|
|
2016-10-02 16:12:47 +02:00
|
|
|
/* The list of all texture buffer objects in this context.
|
|
|
|
* This list is walked when a buffer is invalidated/reallocated and
|
|
|
|
* the GPU addresses are updated. */
|
|
|
|
struct list_head texture_buffers;
|
|
|
|
|
2012-10-05 16:51:41 +02:00
|
|
|
/* Last draw state (-1 = unset). */
|
2017-04-02 20:33:04 +03:00
|
|
|
enum pipe_prim_type last_primitive_type; /* Last primitive type used in draw_vbo. */
|
2017-04-02 20:33:05 +03:00
|
|
|
enum pipe_prim_type current_rast_prim; /* primitive type after TES, GS */
|
|
|
|
enum pipe_prim_type last_rast_prim;
|
2017-04-02 20:33:04 +03:00
|
|
|
unsigned 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;
|
2015-09-11 04:43:53 +01:00
|
|
|
float sample_positions[4 * 16];
|
2015-11-30 14:38:18 +10:00
|
|
|
float tess_state[8];
|
2017-11-28 12:53:02 +10:00
|
|
|
uint32_t cs_block_grid_sizes[8]; /* 3 for grid + 1 pad, 3 for block + 1 pad*/
|
2015-11-30 14:56:10 +10:00
|
|
|
struct r600_pipe_shader_selector *last_ls;
|
|
|
|
struct r600_pipe_shader_selector *last_tcs;
|
|
|
|
unsigned last_num_tcs_input_cp;
|
|
|
|
unsigned lds_alloc;
|
2017-05-09 15:47:12 +10:00
|
|
|
|
|
|
|
/* Debug state. */
|
|
|
|
bool is_debug;
|
|
|
|
struct radeon_saved_cs last_gfx;
|
|
|
|
struct r600_resource *last_trace_buf;
|
|
|
|
struct r600_resource *trace_buf;
|
|
|
|
unsigned trace_id;
|
2017-11-02 10:26:51 +10:00
|
|
|
|
2017-11-24 10:51:35 +10:00
|
|
|
bool cmd_buf_is_compute;
|
2017-11-02 10:26:51 +10:00
|
|
|
struct pipe_resource *append_fence;
|
|
|
|
uint32_t append_fence_id;
|
2010-09-22 17:37:30 -04:00
|
|
|
};
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_emit_command_buffer(struct radeon_winsys_cs *cs,
|
2012-10-05 00:20:27 +02:00
|
|
|
struct r600_command_buffer *cb)
|
|
|
|
{
|
2016-05-06 17:14:29 -05:00
|
|
|
assert(cs->current.cdw + cb->num_dw <= cs->current.max_dw);
|
|
|
|
memcpy(cs->current.buf + cs->current.cdw, cb->buf, 4 * cb->num_dw);
|
|
|
|
cs->current.cdw += cb->num_dw;
|
2012-10-05 00:20:27 +02:00
|
|
|
}
|
|
|
|
|
2015-08-10 00:42:32 +03:00
|
|
|
static inline void r600_set_atom_dirty(struct r600_context *rctx,
|
|
|
|
struct r600_atom *atom,
|
|
|
|
bool dirty)
|
|
|
|
{
|
2015-09-03 01:54:31 +03:00
|
|
|
uint64_t mask;
|
2015-08-10 00:42:35 +03:00
|
|
|
|
|
|
|
assert(atom->id != 0);
|
2015-09-03 01:54:31 +03:00
|
|
|
assert(atom->id < sizeof(mask) * 8);
|
|
|
|
mask = 1ull << atom->id;
|
2015-08-10 00:42:35 +03:00
|
|
|
if (dirty)
|
2015-09-03 01:54:31 +03:00
|
|
|
rctx->dirty_atoms |= mask;
|
2015-08-10 00:42:35 +03:00
|
|
|
else
|
2015-09-03 01:54:31 +03:00
|
|
|
rctx->dirty_atoms &= ~mask;
|
2015-08-10 00:42:32 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void r600_mark_atom_dirty(struct r600_context *rctx,
|
|
|
|
struct r600_atom *atom)
|
|
|
|
{
|
|
|
|
r600_set_atom_dirty(rctx, atom, true);
|
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_emit_atom(struct r600_context *rctx, struct r600_atom *atom)
|
2012-01-30 01:23:14 +01:00
|
|
|
{
|
2013-08-13 21:49:59 +02:00
|
|
|
atom->emit(&rctx->b, atom);
|
2015-08-10 00:42:32 +03:00
|
|
|
r600_set_atom_dirty(rctx, atom, false);
|
2012-01-30 01:23:14 +01:00
|
|
|
}
|
|
|
|
|
2015-08-10 00:42:32 +03:00
|
|
|
static inline void r600_set_cso_state(struct r600_context *rctx,
|
|
|
|
struct r600_cso_state *state, void *cso)
|
2012-10-05 02:45:29 +02:00
|
|
|
{
|
|
|
|
state->cso = cso;
|
2015-08-10 00:42:32 +03:00
|
|
|
r600_set_atom_dirty(rctx, &state->atom, cso != NULL);
|
2012-10-05 02:45:29 +02:00
|
|
|
}
|
|
|
|
|
2015-08-10 00:42:32 +03:00
|
|
|
static inline void r600_set_cso_state_with_cb(struct r600_context *rctx,
|
|
|
|
struct r600_cso_state *state, void *cso,
|
2012-10-05 02:45:29 +02:00
|
|
|
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;
|
2015-08-10 00:42:32 +03:00
|
|
|
r600_set_cso_state(rctx, state, cso);
|
2012-10-05 02:45:29 +02:00
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
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,
|
2014-03-03 22:53:58 +01:00
|
|
|
unsigned width0, unsigned height0,
|
|
|
|
unsigned force_level);
|
2015-11-30 15:22:06 +10:00
|
|
|
void evergreen_init_common_regs(struct r600_context *ctx,
|
|
|
|
struct r600_command_buffer *cb,
|
2012-08-20 14:44:39 +00:00
|
|
|
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);
|
2013-08-02 06:38:23 +04:00
|
|
|
void evergreen_update_es_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
|
|
|
void evergreen_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
2013-03-01 18:42:52 +01:00
|
|
|
void evergreen_update_vs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
2015-11-30 10:29:12 +10:00
|
|
|
void evergreen_update_ls_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
|
|
|
void evergreen_update_hs_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);
|
2015-11-30 15:22:06 +10:00
|
|
|
bool evergreen_adjust_gprs(struct r600_context *rctx);
|
2018-01-19 13:20:36 +10:00
|
|
|
|
|
|
|
uint32_t evergreen_construct_rat_mask(struct r600_context *rctx, struct r600_cb_misc_state *a,
|
|
|
|
unsigned nr_cbufs);
|
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);
|
2017-11-15 09:59:42 +10:00
|
|
|
void r600_decompress_depth_images(struct r600_context *rctx,
|
|
|
|
struct r600_image_state *images);
|
2012-08-12 20:06:33 +02:00
|
|
|
void r600_decompress_color_textures(struct r600_context *rctx,
|
|
|
|
struct r600_samplerview_state *textures);
|
2017-11-15 09:59:42 +10:00
|
|
|
void r600_decompress_color_images(struct r600_context *rctx,
|
|
|
|
struct r600_image_state *images);
|
2014-09-06 17:07:50 +02:00
|
|
|
void r600_resource_copy_region(struct pipe_context *ctx,
|
|
|
|
struct pipe_resource *dst,
|
|
|
|
unsigned dst_level,
|
|
|
|
unsigned dstx, unsigned dsty, unsigned dstz,
|
|
|
|
struct pipe_resource *src,
|
|
|
|
unsigned src_level,
|
|
|
|
const struct pipe_box *src_box);
|
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,
|
2015-08-19 18:58:47 +10:00
|
|
|
union 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);
|
2014-01-30 04:19:57 +00:00
|
|
|
void r600_update_es_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
|
|
|
void r600_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader);
|
2013-03-01 18:42:52 +01:00
|
|
|
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 */
|
2014-04-12 17:53:57 +02:00
|
|
|
void r600_context_gfx_flush(void *context, unsigned flags,
|
|
|
|
struct pipe_fence_handle **fence);
|
2013-03-03 14:33:00 +01:00
|
|
|
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);
|
2016-05-26 22:00:03 +02:00
|
|
|
void r600_emit_pfp_sync_me(struct r600_context *rctx);
|
2013-03-03 14:33:00 +01:00
|
|
|
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,
|
2016-05-26 22:00:03 +02:00
|
|
|
unsigned size, uint32_t clear_value,
|
|
|
|
enum r600_coherency coher);
|
2014-03-17 01:19:51 +01:00
|
|
|
void r600_dma_copy_buffer(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
|
|
|
|
*/
|
2014-03-17 01:19:51 +01:00
|
|
|
void evergreen_dma_copy_buffer(struct r600_context *rctx,
|
|
|
|
struct pipe_resource *dst,
|
|
|
|
struct pipe_resource *src,
|
|
|
|
uint64_t dst_offset,
|
|
|
|
uint64_t src_offset,
|
|
|
|
uint64_t size);
|
2015-11-30 14:56:10 +10:00
|
|
|
void evergreen_setup_tess_constants(struct r600_context *rctx,
|
|
|
|
const struct pipe_draw_info *info,
|
|
|
|
unsigned *num_patches);
|
|
|
|
uint32_t evergreen_get_ls_hs_config(struct r600_context *rctx,
|
|
|
|
const struct pipe_draw_info *info,
|
|
|
|
unsigned num_patches);
|
|
|
|
void evergreen_set_ls_hs_config(struct r600_context *rctx,
|
|
|
|
struct radeon_winsys_cs *cs,
|
|
|
|
uint32_t ls_hs_config);
|
|
|
|
void evergreen_set_lds_alloc(struct r600_context *rctx,
|
|
|
|
struct radeon_winsys_cs *cs,
|
|
|
|
uint32_t lds_alloc);
|
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);
|
2013-02-28 17:27:36 +01:00
|
|
|
void r600_emit_shader(struct r600_context *rctx, struct r600_atom *a);
|
2015-08-10 00:42:33 +03:00
|
|
|
void r600_add_atom(struct r600_context *rctx, struct r600_atom *atom, unsigned id);
|
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);
|
2014-09-10 11:54:40 +02:00
|
|
|
void r600_set_sample_locations_constant_buffer(struct r600_context *rctx);
|
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_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
|
|
|
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,
|
2016-03-21 23:46:15 +02:00
|
|
|
uint32_t *word4_p, uint32_t *yuv_format_p,
|
|
|
|
bool do_endian_swap);
|
|
|
|
uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format format,
|
|
|
|
bool do_endian_swap);
|
|
|
|
uint32_t r600_colorformat_endian_swap(uint32_t colorformat, bool do_endian_swap);
|
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
|
|
|
|
2016-04-29 22:15:48 -05:00
|
|
|
#define PKT_TYPE_S(x) (((unsigned)(x) & 0x3) << 30)
|
|
|
|
#define PKT_COUNT_S(x) (((unsigned)(x) & 0x3FFF) << 16)
|
|
|
|
#define PKT3_IT_OPCODE_S(x) (((unsigned)(x) & 0xFF) << 8)
|
2012-01-31 10:50:51 +01:00
|
|
|
#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)
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_value(struct r600_command_buffer *cb, unsigned value)
|
2012-01-31 10:50:51 +01:00
|
|
|
{
|
2012-10-05 00:20:27 +02:00
|
|
|
cb->buf[cb->num_dw++] = value;
|
2012-01-31 10:50:51 +01:00
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_array(struct r600_command_buffer *cb, unsigned num, unsigned *ptr)
|
2013-03-02 17:14:51 +01:00
|
|
|
{
|
|
|
|
assert(cb->num_dw+num <= cb->max_num_dw);
|
|
|
|
memcpy(&cb->buf[cb->num_dw], ptr, num * sizeof(ptr[0]));
|
|
|
|
cb->num_dw += num;
|
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_config_reg_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
2012-01-31 10:50:51 +01:00
|
|
|
{
|
|
|
|
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.
|
|
|
|
*/
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_context_reg_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
2012-01-31 10:50:51 +01:00
|
|
|
{
|
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.
|
|
|
|
*/
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_ctl_const_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
2012-02-02 08:27:01 +01:00
|
|
|
{
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_loop_const_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
2012-02-03 05:05:31 +01:00
|
|
|
{
|
|
|
|
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.
|
|
|
|
*/
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void eg_store_loop_const_seq(struct r600_command_buffer *cb, unsigned reg, unsigned num)
|
2012-02-08 23:25:58 +01:00
|
|
|
{
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_config_reg(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
2012-01-31 10:50:51 +01:00
|
|
|
{
|
|
|
|
r600_store_config_reg_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_context_reg(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
2012-01-31 10:50:51 +01:00
|
|
|
{
|
|
|
|
r600_store_context_reg_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_ctl_const(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
2012-02-02 08:27:01 +01:00
|
|
|
{
|
|
|
|
r600_store_ctl_const_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void r600_store_loop_const(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
2012-02-03 05:05:31 +01:00
|
|
|
{
|
|
|
|
r600_store_loop_const_seq(cb, reg, 1);
|
|
|
|
r600_store_value(cb, value);
|
|
|
|
}
|
|
|
|
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline void eg_store_loop_const(struct r600_command_buffer *cb, unsigned reg, unsigned value)
|
2012-02-08 23:25:58 +01:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
|
2015-08-30 01:54:00 +02:00
|
|
|
static inline void radeon_compute_set_context_reg_seq(struct radeon_winsys_cs *cs, unsigned reg, unsigned num)
|
2012-07-24 17:33:19 +00:00
|
|
|
{
|
2015-08-30 01:54:00 +02:00
|
|
|
radeon_set_context_reg_seq(cs, reg, num);
|
2012-07-24 17:33:19 +00:00
|
|
|
/* Set the compute bit on the packet header */
|
2016-05-06 17:14:29 -05:00
|
|
|
cs->current.buf[cs->current.cdw - 2] |= RADEON_CP_PACKET3_COMPUTE_MODE;
|
2012-07-24 17:33:19 +00:00
|
|
|
}
|
|
|
|
|
2015-08-30 01:54:00 +02:00
|
|
|
static inline void radeon_set_ctl_const_seq(struct radeon_winsys_cs *cs, unsigned reg, unsigned num)
|
2012-02-02 14:01:12 +01:00
|
|
|
{
|
|
|
|
assert(reg >= R600_CTL_CONST_OFFSET);
|
2016-05-06 17:14:29 -05:00
|
|
|
assert(cs->current.cdw + 2 + num <= cs->current.max_dw);
|
2016-05-06 16:42:03 -05:00
|
|
|
radeon_emit(cs, PKT3(PKT3_SET_CTL_CONST, num, 0));
|
|
|
|
radeon_emit(cs, (reg - R600_CTL_CONST_OFFSET) >> 2);
|
2012-02-02 14:01:12 +01:00
|
|
|
}
|
|
|
|
|
2015-08-30 01:54:00 +02:00
|
|
|
static inline void radeon_compute_set_context_reg(struct radeon_winsys_cs *cs, unsigned reg, unsigned value)
|
2012-07-24 17:33:19 +00:00
|
|
|
{
|
2015-08-30 01:54:00 +02:00
|
|
|
radeon_compute_set_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
|
|
|
}
|
|
|
|
|
2015-08-30 01:54:00 +02:00
|
|
|
static inline void radeon_set_context_reg_flag(struct radeon_winsys_cs *cs, unsigned reg, unsigned value, unsigned flag)
|
2013-04-22 20:06:54 -07:00
|
|
|
{
|
|
|
|
if (flag & RADEON_CP_PACKET3_COMPUTE_MODE) {
|
2015-08-30 01:54:00 +02:00
|
|
|
radeon_compute_set_context_reg(cs, reg, value);
|
2013-04-22 20:06:54 -07:00
|
|
|
} else {
|
2015-08-30 01:54:00 +02:00
|
|
|
radeon_set_context_reg(cs, reg, value);
|
2013-04-22 20:06:54 -07:00
|
|
|
}
|
|
|
|
}
|
2013-08-13 21:49:59 +02:00
|
|
|
|
2015-08-30 01:54:00 +02:00
|
|
|
static inline void radeon_set_ctl_const(struct radeon_winsys_cs *cs, unsigned reg, unsigned value)
|
2012-02-02 14:01:12 +01:00
|
|
|
{
|
2015-08-30 01:54:00 +02:00
|
|
|
radeon_set_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
|
|
|
|
*/
|
2010-09-29 14:26:29 -04:00
|
|
|
|
2012-01-27 21:20:27 +01:00
|
|
|
/* 12.4 fixed-point */
|
2015-07-20 19:58:43 -04:00
|
|
|
static inline unsigned r600_pack_float_12p4(float x)
|
2012-01-27 21:20:27 +01:00
|
|
|
{
|
|
|
|
return x <= 0 ? 0 :
|
|
|
|
x >= 4096 ? 0xffff : x * 16;
|
|
|
|
}
|
|
|
|
|
2016-05-26 17:18:13 +02:00
|
|
|
static inline unsigned r600_get_flush_flags(enum r600_coherency coher)
|
|
|
|
{
|
|
|
|
switch (coher) {
|
|
|
|
default:
|
|
|
|
case R600_COHERENCY_NONE:
|
|
|
|
return 0;
|
|
|
|
case R600_COHERENCY_SHADER:
|
|
|
|
return R600_CONTEXT_INV_CONST_CACHE |
|
|
|
|
R600_CONTEXT_INV_VERTEX_CACHE |
|
|
|
|
R600_CONTEXT_INV_TEX_CACHE |
|
|
|
|
R600_CONTEXT_STREAMOUT_FLUSH;
|
|
|
|
case R600_COHERENCY_CB_META:
|
|
|
|
return R600_CONTEXT_FLUSH_AND_INV_CB |
|
|
|
|
R600_CONTEXT_FLUSH_AND_INV_CB_META;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-20 15:19:43 +02:00
|
|
|
#define V_028A6C_OUTPRIM_TYPE_POINTLIST 0
|
|
|
|
#define V_028A6C_OUTPRIM_TYPE_LINESTRIP 1
|
|
|
|
#define V_028A6C_OUTPRIM_TYPE_TRISTRIP 2
|
|
|
|
|
2015-08-30 20:40:31 +10:00
|
|
|
unsigned r600_conv_prim_to_gs_out(unsigned mode);
|
2017-05-09 15:47:12 +10:00
|
|
|
|
|
|
|
void eg_trace_emit(struct r600_context *rctx);
|
|
|
|
void eg_dump_debug_state(struct pipe_context *ctx, FILE *f,
|
|
|
|
unsigned flags);
|
2017-11-02 10:26:51 +10:00
|
|
|
|
2017-11-03 11:33:44 +10:00
|
|
|
struct r600_pipe_shader_selector *r600_create_shader_state_tokens(struct pipe_context *ctx,
|
|
|
|
const struct tgsi_token *tokens,
|
|
|
|
unsigned pipe_shader_type);
|
|
|
|
int r600_shader_select(struct pipe_context *ctx,
|
|
|
|
struct r600_pipe_shader_selector* sel,
|
|
|
|
bool *dirty);
|
|
|
|
|
|
|
|
void r600_delete_shader_selector(struct pipe_context *ctx,
|
|
|
|
struct r600_pipe_shader_selector *sel);
|
|
|
|
|
2017-11-02 10:26:51 +10:00
|
|
|
struct r600_shader_atomic;
|
|
|
|
bool evergreen_emit_atomic_buffer_setup(struct r600_context *rctx,
|
2017-11-03 11:11:15 +10:00
|
|
|
struct r600_pipe_shader *cs_shader,
|
2017-11-02 10:26:51 +10:00
|
|
|
struct r600_shader_atomic *combined_atomics,
|
|
|
|
uint8_t *atomic_used_mask_p);
|
|
|
|
void evergreen_emit_atomic_buffer_save(struct r600_context *rctx,
|
2017-11-03 11:11:15 +10:00
|
|
|
bool is_compute,
|
2017-11-02 10:26:51 +10:00
|
|
|
struct r600_shader_atomic *combined_atomics,
|
|
|
|
uint8_t *atomic_used_mask_p);
|
2017-11-03 11:27:23 +10:00
|
|
|
void r600_update_compressed_resource_state(struct r600_context *rctx, bool compute_only);
|
2017-11-02 10:26:51 +10:00
|
|
|
|
2017-11-27 16:12:18 +10:00
|
|
|
void eg_setup_buffer_constants(struct r600_context *rctx, int shader_type);
|
|
|
|
void r600_update_driver_const_buffers(struct r600_context *rctx, bool compute_only);
|
2010-09-22 17:37:30 -04:00
|
|
|
#endif
|