Path: blob/21.2-virgl/src/gallium/drivers/r600/r600_pipe.c
4570 views
/*1* Copyright 2010 Jerome Glisse <[email protected]>2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* on the rights to use, copy, modify, merge, publish, distribute, sub7* license, and/or sell copies of the Software, and to permit persons to whom8* the Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL17* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,18* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR19* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE20* USE OR OTHER DEALINGS IN THE SOFTWARE.21*/22#include "r600_pipe.h"23#include "r600_public.h"24#include "r600_isa.h"25#include "evergreen_compute.h"26#include "r600d.h"2728#include "sb/sb_public.h"2930#include <errno.h>31#include "pipe/p_shader_tokens.h"32#include "util/u_debug.h"33#include "util/u_memory.h"34#include "util/u_screen.h"35#include "util/u_simple_shaders.h"36#include "util/u_upload_mgr.h"37#include "util/u_math.h"38#include "vl/vl_decoder.h"39#include "vl/vl_video_buffer.h"40#include "radeon_video.h"41#include "radeon_uvd.h"42#include "util/os_time.h"4344static const struct debug_named_value r600_debug_options[] = {45/* features */46{ "nocpdma", DBG_NO_CP_DMA, "Disable CP DMA" },4748/* shader backend */49{ "nosb", DBG_NO_SB, "Disable sb backend for graphics shaders" },50{ "sbcl", DBG_SB_CS, "Enable sb backend for compute shaders" },51{ "sbdry", DBG_SB_DRY_RUN, "Don't use optimized bytecode (just print the dumps)" },52{ "sbstat", DBG_SB_STAT, "Print optimization statistics for shaders" },53{ "sbdump", DBG_SB_DUMP, "Print IR dumps after some optimization passes" },54{ "sbnofallback", DBG_SB_NO_FALLBACK, "Abort on errors instead of fallback" },55{ "sbdisasm", DBG_SB_DISASM, "Use sb disassembler for shader dumps" },56{ "sbsafemath", DBG_SB_SAFEMATH, "Disable unsafe math optimizations" },57{ "nirsb", DBG_NIR_SB, "Enable NIR with SB optimizer"},5859DEBUG_NAMED_VALUE_END /* must be last */60};6162/*63* pipe_context64*/6566static void r600_destroy_context(struct pipe_context *context)67{68struct r600_context *rctx = (struct r600_context *)context;69unsigned sh, i;7071r600_isa_destroy(rctx->isa);7273r600_sb_context_destroy(rctx->sb_context);7475for (sh = 0; sh < (rctx->b.chip_class < EVERGREEN ? R600_NUM_HW_STAGES : EG_NUM_HW_STAGES); sh++) {76r600_resource_reference(&rctx->scratch_buffers[sh].buffer, NULL);77}78r600_resource_reference(&rctx->dummy_cmask, NULL);79r600_resource_reference(&rctx->dummy_fmask, NULL);8081if (rctx->append_fence)82pipe_resource_reference((struct pipe_resource**)&rctx->append_fence, NULL);83for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) {84rctx->b.b.set_constant_buffer(&rctx->b.b, sh, R600_BUFFER_INFO_CONST_BUFFER, false, NULL);85free(rctx->driver_consts[sh].constants);86}8788if (rctx->fixed_func_tcs_shader)89rctx->b.b.delete_tcs_state(&rctx->b.b, rctx->fixed_func_tcs_shader);9091if (rctx->dummy_pixel_shader) {92rctx->b.b.delete_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);93}94if (rctx->custom_dsa_flush) {95rctx->b.b.delete_depth_stencil_alpha_state(&rctx->b.b, rctx->custom_dsa_flush);96}97if (rctx->custom_blend_resolve) {98rctx->b.b.delete_blend_state(&rctx->b.b, rctx->custom_blend_resolve);99}100if (rctx->custom_blend_decompress) {101rctx->b.b.delete_blend_state(&rctx->b.b, rctx->custom_blend_decompress);102}103if (rctx->custom_blend_fastclear) {104rctx->b.b.delete_blend_state(&rctx->b.b, rctx->custom_blend_fastclear);105}106util_unreference_framebuffer_state(&rctx->framebuffer.state);107108if (rctx->gs_rings.gsvs_ring.buffer)109pipe_resource_reference(&rctx->gs_rings.gsvs_ring.buffer, NULL);110111if (rctx->gs_rings.esgs_ring.buffer)112pipe_resource_reference(&rctx->gs_rings.esgs_ring.buffer, NULL);113114for (sh = 0; sh < PIPE_SHADER_TYPES; ++sh)115for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; ++i)116rctx->b.b.set_constant_buffer(context, sh, i, false, NULL);117118if (rctx->blitter) {119util_blitter_destroy(rctx->blitter);120}121u_suballocator_destroy(&rctx->allocator_fetch_shader);122123r600_release_command_buffer(&rctx->start_cs_cmd);124125FREE(rctx->start_compute_cs_cmd.buf);126127r600_common_context_cleanup(&rctx->b);128129r600_resource_reference(&rctx->trace_buf, NULL);130r600_resource_reference(&rctx->last_trace_buf, NULL);131radeon_clear_saved_cs(&rctx->last_gfx);132133FREE(rctx);134}135136static struct pipe_context *r600_create_context(struct pipe_screen *screen,137void *priv, unsigned flags)138{139struct r600_context *rctx = CALLOC_STRUCT(r600_context);140struct r600_screen* rscreen = (struct r600_screen *)screen;141struct radeon_winsys *ws = rscreen->b.ws;142143if (!rctx)144return NULL;145146rctx->b.b.screen = screen;147assert(!priv);148rctx->b.b.priv = NULL; /* for threaded_context_unwrap_sync */149rctx->b.b.destroy = r600_destroy_context;150rctx->b.set_atom_dirty = (void *)r600_set_atom_dirty;151152if (!r600_common_context_init(&rctx->b, &rscreen->b, flags))153goto fail;154155rctx->screen = rscreen;156list_inithead(&rctx->texture_buffers);157158r600_init_blit_functions(rctx);159160if (rscreen->b.info.has_video_hw.uvd_decode) {161rctx->b.b.create_video_codec = r600_uvd_create_decoder;162rctx->b.b.create_video_buffer = r600_video_buffer_create;163} else {164rctx->b.b.create_video_codec = vl_create_decoder;165rctx->b.b.create_video_buffer = vl_video_buffer_create;166}167168if (getenv("R600_TRACE"))169rctx->is_debug = true;170r600_init_common_state_functions(rctx);171172switch (rctx->b.chip_class) {173case R600:174case R700:175r600_init_state_functions(rctx);176r600_init_atom_start_cs(rctx);177rctx->custom_dsa_flush = r600_create_db_flush_dsa(rctx);178rctx->custom_blend_resolve = rctx->b.chip_class == R700 ? r700_create_resolve_blend(rctx)179: r600_create_resolve_blend(rctx);180rctx->custom_blend_decompress = r600_create_decompress_blend(rctx);181rctx->has_vertex_cache = !(rctx->b.family == CHIP_RV610 ||182rctx->b.family == CHIP_RV620 ||183rctx->b.family == CHIP_RS780 ||184rctx->b.family == CHIP_RS880 ||185rctx->b.family == CHIP_RV710);186break;187case EVERGREEN:188case CAYMAN:189evergreen_init_state_functions(rctx);190evergreen_init_atom_start_cs(rctx);191evergreen_init_atom_start_compute_cs(rctx);192rctx->custom_dsa_flush = evergreen_create_db_flush_dsa(rctx);193rctx->custom_blend_resolve = evergreen_create_resolve_blend(rctx);194rctx->custom_blend_decompress = evergreen_create_decompress_blend(rctx);195rctx->custom_blend_fastclear = evergreen_create_fastclear_blend(rctx);196rctx->has_vertex_cache = !(rctx->b.family == CHIP_CEDAR ||197rctx->b.family == CHIP_PALM ||198rctx->b.family == CHIP_SUMO ||199rctx->b.family == CHIP_SUMO2 ||200rctx->b.family == CHIP_CAICOS ||201rctx->b.family == CHIP_CAYMAN ||202rctx->b.family == CHIP_ARUBA);203204rctx->append_fence = pipe_buffer_create(rctx->b.b.screen, PIPE_BIND_CUSTOM,205PIPE_USAGE_DEFAULT, 32);206break;207default:208R600_ERR("Unsupported chip class %d.\n", rctx->b.chip_class);209goto fail;210}211212ws->cs_create(&rctx->b.gfx.cs, rctx->b.ctx, RING_GFX,213r600_context_gfx_flush, rctx, false);214rctx->b.gfx.flush = r600_context_gfx_flush;215216u_suballocator_init(&rctx->allocator_fetch_shader, &rctx->b.b, 64 * 1024,2170, PIPE_USAGE_DEFAULT, 0, FALSE);218219rctx->isa = calloc(1, sizeof(struct r600_isa));220if (!rctx->isa || r600_isa_init(rctx, rctx->isa))221goto fail;222223if (rscreen->b.debug_flags & DBG_FORCE_DMA)224rctx->b.b.resource_copy_region = rctx->b.dma_copy;225226rctx->blitter = util_blitter_create(&rctx->b.b);227if (rctx->blitter == NULL)228goto fail;229util_blitter_set_texture_multisample(rctx->blitter, rscreen->has_msaa);230rctx->blitter->draw_rectangle = r600_draw_rectangle;231232r600_begin_new_cs(rctx);233234rctx->dummy_pixel_shader =235util_make_fragment_cloneinput_shader(&rctx->b.b, 0,236TGSI_SEMANTIC_GENERIC,237TGSI_INTERPOLATE_CONSTANT);238rctx->b.b.bind_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);239240return &rctx->b.b;241242fail:243r600_destroy_context(&rctx->b.b);244return NULL;245}246247static bool is_nir_enabled(struct r600_common_screen *screen) {248return ((screen->debug_flags & DBG_NIR_PREFERRED) &&249screen->family >= CHIP_CEDAR);250}251252/*253* pipe_screen254*/255256static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)257{258struct r600_screen *rscreen = (struct r600_screen *)pscreen;259enum radeon_family family = rscreen->b.family;260261switch (param) {262/* Supported features (boolean caps). */263case PIPE_CAP_NPOT_TEXTURES:264case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:265case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:266case PIPE_CAP_ANISOTROPIC_FILTER:267case PIPE_CAP_POINT_SPRITE:268case PIPE_CAP_OCCLUSION_QUERY:269case PIPE_CAP_TEXTURE_MIRROR_CLAMP:270case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:271case PIPE_CAP_BLEND_EQUATION_SEPARATE:272case PIPE_CAP_TEXTURE_SWIZZLE:273case PIPE_CAP_DEPTH_CLIP_DISABLE:274case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE:275case PIPE_CAP_SHADER_STENCIL_EXPORT:276case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:277case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:278case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:279case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:280case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:281case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:282case PIPE_CAP_VERTEX_SHADER_SATURATE:283case PIPE_CAP_SEAMLESS_CUBE_MAP:284case PIPE_CAP_PRIMITIVE_RESTART:285case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:286case PIPE_CAP_CONDITIONAL_RENDER:287case PIPE_CAP_TEXTURE_BARRIER:288case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:289case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:290case PIPE_CAP_TGSI_INSTANCEID:291case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:292case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:293case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:294case PIPE_CAP_START_INSTANCE:295case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:296case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:297case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:298case PIPE_CAP_QUERY_PIPELINE_STATISTICS:299case PIPE_CAP_TEXTURE_MULTISAMPLE:300case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:301case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:302case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:303case PIPE_CAP_SAMPLE_SHADING:304case PIPE_CAP_CLIP_HALFZ:305case PIPE_CAP_POLYGON_OFFSET_CLAMP:306case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:307case PIPE_CAP_TEXTURE_FLOAT_LINEAR:308case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:309case PIPE_CAP_TGSI_TXQS:310case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:311case PIPE_CAP_INVALIDATE_BUFFER:312case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:313case PIPE_CAP_QUERY_MEMORY_INFO:314case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:315case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:316case PIPE_CAP_CLEAR_TEXTURE:317case PIPE_CAP_TGSI_MUL_ZERO_WINS:318case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:319case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:320case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:321case PIPE_CAP_NIR_ATOMICS_AS_DEREF:322return 1;323324case PIPE_CAP_SHAREABLE_SHADERS:325return 0;326327case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET:328/* Optimal number for good TexSubImage performance on Polaris10. */329return 64 * 1024 * 1024;330331case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:332return rscreen->b.info.drm_minor >= 43;333334case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:335return !R600_BIG_ENDIAN && rscreen->b.info.has_userptr;336337case PIPE_CAP_COMPUTE:338return rscreen->b.chip_class > R700;339340case PIPE_CAP_TGSI_TEXCOORD:341return 1;342343case PIPE_CAP_NIR_IMAGES_AS_DEREF:344case PIPE_CAP_FAKE_SW_MSAA:345return 0;346347case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:348return MIN2(rscreen->b.info.max_alloc_size, INT_MAX);349350case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:351return R600_MAP_BUFFER_ALIGNMENT;352353case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:354return 256;355356case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:357return 4;358359case PIPE_CAP_GLSL_FEATURE_LEVEL:360if (family >= CHIP_CEDAR)361return is_nir_enabled(&rscreen->b) ? 450 : 430;362/* pre-evergreen geom shaders need newer kernel */363if (rscreen->b.info.drm_minor >= 37)364return 330;365return 140;366367case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:368return 140;369370/* Supported except the original R600. */371case PIPE_CAP_INDEP_BLEND_ENABLE:372case PIPE_CAP_INDEP_BLEND_FUNC:373/* R600 doesn't support per-MRT blends */374return family == CHIP_R600 ? 0 : 1;375376/* Supported on Evergreen. */377case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:378case PIPE_CAP_CUBE_MAP_ARRAY:379case PIPE_CAP_TEXTURE_GATHER_SM5:380case PIPE_CAP_TEXTURE_QUERY_LOD:381case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:382case PIPE_CAP_SAMPLER_VIEW_TARGET:383case PIPE_CAP_TGSI_PACK_HALF_FLOAT:384case PIPE_CAP_TGSI_CLOCK:385case PIPE_CAP_TGSI_ARRAY_COMPONENTS:386case PIPE_CAP_QUERY_BUFFER_OBJECT:387return family >= CHIP_CEDAR ? 1 : 0;388case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:389return family >= CHIP_CEDAR ? 4 : 0;390case PIPE_CAP_DRAW_INDIRECT:391/* kernel command checker support is also required */392return family >= CHIP_CEDAR && rscreen->b.info.drm_minor >= 41;393394case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:395return family >= CHIP_CEDAR ? 0 : 1;396397case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:398return 8;399400case PIPE_CAP_MAX_GS_INVOCATIONS:401return 32;402403/* shader buffer objects */404case PIPE_CAP_MAX_SHADER_BUFFER_SIZE:405return 1 << 27;406case PIPE_CAP_MAX_COMBINED_SHADER_BUFFERS:407return 8;408409case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:410return 0;411412case PIPE_CAP_INT64:413case PIPE_CAP_DOUBLES:414if (rscreen->b.family == CHIP_ARUBA ||415rscreen->b.family == CHIP_CAYMAN ||416rscreen->b.family == CHIP_CYPRESS ||417rscreen->b.family == CHIP_HEMLOCK)418return 1;419if (is_nir_enabled(&rscreen->b))420return 1;421return 0;422case PIPE_CAP_INT64_DIVMOD:423/* it is actually not supported, but the nir lowering hdanles this corectly wheras424* the glsl lowering path seems to not initialize the buildins correctly.425*/426return is_nir_enabled(&rscreen->b);427case PIPE_CAP_CULL_DISTANCE:428return 1;429430case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:431if (family >= CHIP_CEDAR)432return 256;433return 0;434435case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:436if (family >= CHIP_CEDAR)437return 30;438else439return 0;440/* Stream output. */441case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:442return rscreen->b.has_streamout ? 4 : 0;443case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:444case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:445return rscreen->b.has_streamout ? 1 : 0;446case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:447case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:448return 32*4;449450/* Geometry shader output. */451case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:452return 1024;453case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:454return 16384;455case PIPE_CAP_MAX_VERTEX_STREAMS:456return family >= CHIP_CEDAR ? 4 : 1;457458case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:459/* Should be 2047, but 2048 is a requirement for GL 4.4 */460return 2048;461462/* Texturing. */463case PIPE_CAP_MAX_TEXTURE_2D_SIZE:464if (family >= CHIP_CEDAR)465return 16384;466else467return 8192;468case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:469if (family >= CHIP_CEDAR)470return 15;471else472return 14;473case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:474/* textures support 8192, but layered rendering supports 2048 */475return 12;476case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:477/* textures support 8192, but layered rendering supports 2048 */478return 2048;479480/* Render targets. */481case PIPE_CAP_MAX_RENDER_TARGETS:482/* XXX some r6xx are buggy and can only do 4 */483return 8;484485case PIPE_CAP_MAX_VIEWPORTS:486return R600_MAX_VIEWPORTS;487case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:488case PIPE_CAP_RASTERIZER_SUBPIXEL_BITS:489return 8;490491/* Timer queries, present when the clock frequency is non zero. */492case PIPE_CAP_QUERY_TIME_ELAPSED:493return rscreen->b.info.clock_crystal_freq != 0;494case PIPE_CAP_QUERY_TIMESTAMP:495return rscreen->b.info.drm_minor >= 20 &&496rscreen->b.info.clock_crystal_freq != 0;497498case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:499case PIPE_CAP_MIN_TEXEL_OFFSET:500return -8;501502case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:503case PIPE_CAP_MAX_TEXEL_OFFSET:504return 7;505506case PIPE_CAP_MAX_VARYINGS:507return 32;508509case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:510return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600;511case PIPE_CAP_ENDIANNESS:512return PIPE_ENDIAN_LITTLE;513514case PIPE_CAP_VENDOR_ID:515return ATI_VENDOR_ID;516case PIPE_CAP_DEVICE_ID:517return rscreen->b.info.pci_id;518case PIPE_CAP_ACCELERATED:519return 1;520case PIPE_CAP_VIDEO_MEMORY:521return rscreen->b.info.vram_size >> 20;522case PIPE_CAP_UMA:523return 0;524case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:525return rscreen->b.chip_class >= R700;526case PIPE_CAP_PCI_GROUP:527return rscreen->b.info.pci_domain;528case PIPE_CAP_PCI_BUS:529return rscreen->b.info.pci_bus;530case PIPE_CAP_PCI_DEVICE:531return rscreen->b.info.pci_dev;532case PIPE_CAP_PCI_FUNCTION:533return rscreen->b.info.pci_func;534535case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:536if (rscreen->b.family >= CHIP_CEDAR && rscreen->has_atomics)537return 8;538return 0;539case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:540if (rscreen->b.family >= CHIP_CEDAR && rscreen->has_atomics)541return EG_MAX_ATOMIC_BUFFERS;542return 0;543544default:545return u_pipe_screen_get_param_defaults(pscreen, param);546}547}548549static int r600_get_shader_param(struct pipe_screen* pscreen,550enum pipe_shader_type shader,551enum pipe_shader_cap param)552{553struct r600_screen *rscreen = (struct r600_screen *)pscreen;554555switch(shader)556{557case PIPE_SHADER_FRAGMENT:558case PIPE_SHADER_VERTEX:559break;560case PIPE_SHADER_GEOMETRY:561if (rscreen->b.family >= CHIP_CEDAR)562break;563/* pre-evergreen geom shaders need newer kernel */564if (rscreen->b.info.drm_minor >= 37)565break;566return 0;567case PIPE_SHADER_TESS_CTRL:568case PIPE_SHADER_TESS_EVAL:569case PIPE_SHADER_COMPUTE:570if (rscreen->b.family >= CHIP_CEDAR)571break;572FALLTHROUGH;573default:574return 0;575}576577switch (param) {578case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:579case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:580case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:581case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:582return 16384;583case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:584return 32;585case PIPE_SHADER_CAP_MAX_INPUTS:586return shader == PIPE_SHADER_VERTEX ? 16 : 32;587case PIPE_SHADER_CAP_MAX_OUTPUTS:588return shader == PIPE_SHADER_FRAGMENT ? 8 : 32;589case PIPE_SHADER_CAP_MAX_TEMPS:590return 256; /* Max native temporaries. */591case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:592if (shader == PIPE_SHADER_COMPUTE) {593uint64_t max_const_buffer_size;594enum pipe_shader_ir ir_type = is_nir_enabled(&rscreen->b) ?595PIPE_SHADER_IR_NIR: PIPE_SHADER_IR_TGSI;596pscreen->get_compute_param(pscreen, ir_type,597PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,598&max_const_buffer_size);599return MIN2(max_const_buffer_size, INT_MAX);600601} else {602return R600_MAX_CONST_BUFFER_SIZE;603}604case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:605return R600_MAX_USER_CONST_BUFFERS;606case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:607return 1;608case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:609return 1;610case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:611case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:612case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:613case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:614return 1;615case PIPE_SHADER_CAP_SUBROUTINES:616case PIPE_SHADER_CAP_INT64_ATOMICS:617case PIPE_SHADER_CAP_FP16:618case PIPE_SHADER_CAP_FP16_DERIVATIVES:619case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:620case PIPE_SHADER_CAP_INT16:621case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:622return 0;623case PIPE_SHADER_CAP_INTEGERS:624case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:625return 1;626case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:627case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:628return 16;629case PIPE_SHADER_CAP_PREFERRED_IR:630if (is_nir_enabled(&rscreen->b))631return PIPE_SHADER_IR_NIR;632return PIPE_SHADER_IR_TGSI;633case PIPE_SHADER_CAP_SUPPORTED_IRS: {634int ir = 0;635if (shader == PIPE_SHADER_COMPUTE)636ir = 1 << PIPE_SHADER_IR_NATIVE;637if (rscreen->b.family >= CHIP_CEDAR) {638ir |= 1 << PIPE_SHADER_IR_TGSI;639if (is_nir_enabled(&rscreen->b))640ir |= 1 << PIPE_SHADER_IR_NIR;641}642return ir;643}644case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:645if (rscreen->b.family == CHIP_ARUBA ||646rscreen->b.family == CHIP_CAYMAN ||647rscreen->b.family == CHIP_CYPRESS ||648rscreen->b.family == CHIP_HEMLOCK)649return 1;650return 0;651case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:652case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:653case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:654case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:655case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:656return 0;657case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:658case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:659if (rscreen->b.family >= CHIP_CEDAR &&660(shader == PIPE_SHADER_FRAGMENT || shader == PIPE_SHADER_COMPUTE))661return 8;662return 0;663case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:664if (rscreen->b.family >= CHIP_CEDAR && rscreen->has_atomics)665return 8;666return 0;667case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:668/* having to allocate the atomics out amongst shaders stages is messy,669so give compute 8 buffers and all the others one */670if (rscreen->b.family >= CHIP_CEDAR && rscreen->has_atomics) {671return EG_MAX_ATOMIC_BUFFERS;672}673return 0;674case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:675/* due to a bug in the shader compiler, some loops hang676* if they are not unrolled, see:677* https://bugs.freedesktop.org/show_bug.cgi?id=86720678*/679return 255;680}681return 0;682}683684static void r600_destroy_screen(struct pipe_screen* pscreen)685{686struct r600_screen *rscreen = (struct r600_screen *)pscreen;687688if (!rscreen)689return;690691if (!rscreen->b.ws->unref(rscreen->b.ws))692return;693694if (rscreen->global_pool) {695compute_memory_pool_delete(rscreen->global_pool);696}697698r600_destroy_common_screen(&rscreen->b);699}700701static struct pipe_resource *r600_resource_create(struct pipe_screen *screen,702const struct pipe_resource *templ)703{704if (templ->target == PIPE_BUFFER &&705(templ->bind & PIPE_BIND_GLOBAL))706return r600_compute_global_buffer_create(screen, templ);707708return r600_resource_create_common(screen, templ);709}710711struct pipe_screen *r600_screen_create(struct radeon_winsys *ws,712const struct pipe_screen_config *config)713{714struct r600_screen *rscreen = CALLOC_STRUCT(r600_screen);715716if (!rscreen) {717return NULL;718}719720/* Set functions first. */721rscreen->b.b.context_create = r600_create_context;722rscreen->b.b.destroy = r600_destroy_screen;723rscreen->b.b.get_param = r600_get_param;724rscreen->b.b.get_shader_param = r600_get_shader_param;725rscreen->b.b.resource_create = r600_resource_create;726727if (!r600_common_screen_init(&rscreen->b, ws)) {728FREE(rscreen);729return NULL;730}731732if (rscreen->b.info.chip_class >= EVERGREEN) {733rscreen->b.b.is_format_supported = evergreen_is_format_supported;734} else {735rscreen->b.b.is_format_supported = r600_is_format_supported;736}737738rscreen->b.debug_flags |= debug_get_flags_option("R600_DEBUG", r600_debug_options, 0);739if (debug_get_bool_option("R600_DEBUG_COMPUTE", FALSE))740rscreen->b.debug_flags |= DBG_COMPUTE;741if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE))742rscreen->b.debug_flags |= DBG_ALL_SHADERS | DBG_FS;743if (!debug_get_bool_option("R600_HYPERZ", TRUE))744rscreen->b.debug_flags |= DBG_NO_HYPERZ;745746if (rscreen->b.family == CHIP_UNKNOWN) {747fprintf(stderr, "r600: Unknown chipset 0x%04X\n", rscreen->b.info.pci_id);748FREE(rscreen);749return NULL;750}751752/* Figure out streamout kernel support. */753switch (rscreen->b.chip_class) {754case R600:755if (rscreen->b.family < CHIP_RS780) {756rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 14;757} else {758rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 23;759}760break;761case R700:762rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 17;763break;764case EVERGREEN:765case CAYMAN:766rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 14;767break;768default:769rscreen->b.has_streamout = FALSE;770break;771}772773/* MSAA support. */774switch (rscreen->b.chip_class) {775case R600:776case R700:777rscreen->has_msaa = rscreen->b.info.drm_minor >= 22;778rscreen->has_compressed_msaa_texturing = false;779break;780case EVERGREEN:781rscreen->has_msaa = rscreen->b.info.drm_minor >= 19;782rscreen->has_compressed_msaa_texturing = rscreen->b.info.drm_minor >= 24;783break;784case CAYMAN:785rscreen->has_msaa = rscreen->b.info.drm_minor >= 19;786rscreen->has_compressed_msaa_texturing = true;787break;788default:789rscreen->has_msaa = FALSE;790rscreen->has_compressed_msaa_texturing = false;791}792793rscreen->b.has_cp_dma = rscreen->b.info.drm_minor >= 27 &&794!(rscreen->b.debug_flags & DBG_NO_CP_DMA);795796rscreen->b.barrier_flags.cp_to_L2 =797R600_CONTEXT_INV_VERTEX_CACHE |798R600_CONTEXT_INV_TEX_CACHE |799R600_CONTEXT_INV_CONST_CACHE;800rscreen->b.barrier_flags.compute_to_L2 = R600_CONTEXT_CS_PARTIAL_FLUSH | R600_CONTEXT_FLUSH_AND_INV;801802rscreen->global_pool = compute_memory_pool_new(rscreen);803804/* Create the auxiliary context. This must be done last. */805rscreen->b.aux_context = rscreen->b.b.context_create(&rscreen->b.b, NULL, 0);806807rscreen->has_atomics = rscreen->b.info.drm_minor >= 44;808#if 0 /* This is for testing whether aux_context and buffer clearing work correctly. */809struct pipe_resource templ = {};810811templ.width0 = 4;812templ.height0 = 2048;813templ.depth0 = 1;814templ.array_size = 1;815templ.target = PIPE_TEXTURE_2D;816templ.format = PIPE_FORMAT_R8G8B8A8_UNORM;817templ.usage = PIPE_USAGE_DEFAULT;818819struct r600_resource *res = r600_resource(rscreen->screen.resource_create(&rscreen->screen, &templ));820unsigned char *map = ws->buffer_map(res->buf, NULL, PIPE_MAP_WRITE);821822memset(map, 0, 256);823824r600_screen_clear_buffer(rscreen, &res->b.b, 4, 4, 0xCC);825r600_screen_clear_buffer(rscreen, &res->b.b, 8, 4, 0xDD);826r600_screen_clear_buffer(rscreen, &res->b.b, 12, 4, 0xEE);827r600_screen_clear_buffer(rscreen, &res->b.b, 20, 4, 0xFF);828r600_screen_clear_buffer(rscreen, &res->b.b, 32, 20, 0x87);829830ws->buffer_wait(res->buf, RADEON_USAGE_WRITE);831832int i;833for (i = 0; i < 256; i++) {834printf("%02X", map[i]);835if (i % 16 == 15)836printf("\n");837}838#endif839840if (rscreen->b.debug_flags & DBG_TEST_DMA)841r600_test_dma(&rscreen->b);842843r600_query_fix_enabled_rb_mask(&rscreen->b);844return &rscreen->b.b;845}846847848