X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr300%2Fr300_screen.c;h=6292c2c4a03ab0fbc40f475266bdce0bfb132bc7;hb=26222932c013da3688e39dc831179659cc65c39a;hp=60759160b0e920507f53bf151ac81400ea382286;hpb=27e216a07501f4d2ade1e1ec8b9a1f709304013b;p=mesa.git diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index 60759160b0e..6292c2c4a03 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -47,6 +47,11 @@ static const char* r300_get_vendor(struct pipe_screen* pscreen) return "X.Org R300 Project"; } +static const char* r300_get_device_vendor(struct pipe_screen* pscreen) +{ + return "ATI"; +} + static const char* chip_families[] = { "unknown", "ATI R300", @@ -89,6 +94,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) switch (param) { /* Supported features (boolean caps). */ case PIPE_CAP_NPOT_TEXTURES: + case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: case PIPE_CAP_TWO_SIDED_STENCIL: case PIPE_CAP_ANISOTROPIC_FILTER: case PIPE_CAP_POINT_SPRITE: @@ -101,11 +107,12 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: case PIPE_CAP_CONDITIONAL_RENDER: case PIPE_CAP_TEXTURE_BARRIER: - case PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS: case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: case PIPE_CAP_USER_INDEX_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS: - case PIPE_CAP_DEPTH_CLIP_DISABLE: /* XXX implemented, but breaks Regnum Online */ + case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: + case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: + case PIPE_CAP_CLIP_HALFZ: return 1; case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: @@ -134,9 +141,11 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) /* Unsupported features. */ case PIPE_CAP_QUERY_TIME_ELAPSED: + case PIPE_CAP_QUERY_PIPELINE_STATISTICS: case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: case PIPE_CAP_INDEP_BLEND_ENABLE: case PIPE_CAP_INDEP_BLEND_FUNC: + case PIPE_CAP_DEPTH_CLIP_DISABLE: case PIPE_CAP_SHADER_STENCIL_EXPORT: case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: case PIPE_CAP_TGSI_INSTANCEID: @@ -144,12 +153,16 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: case PIPE_CAP_SEAMLESS_CUBE_MAP: case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: - case PIPE_CAP_SCALED_RESOLVE: case PIPE_CAP_MIN_TEXEL_OFFSET: case PIPE_CAP_MAX_TEXEL_OFFSET: + case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET: + case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET: case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: + case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES: + case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: + case PIPE_CAP_MAX_VERTEX_STREAMS: case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: @@ -160,11 +173,31 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_CUBE_MAP_ARRAY: case PIPE_CAP_TEXTURE_BUFFER_OBJECTS: case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: + case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK: + case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE: + case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: + case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: + case PIPE_CAP_TEXTURE_GATHER_SM5: + case PIPE_CAP_TEXTURE_QUERY_LOD: + case PIPE_CAP_FAKE_SW_MSAA: + case PIPE_CAP_SAMPLE_SHADING: + case PIPE_CAP_TEXTURE_GATHER_OFFSETS: + case PIPE_CAP_DRAW_INDIRECT: + case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: + case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: + case PIPE_CAP_SAMPLER_VIEW_TARGET: + case PIPE_CAP_VERTEXID_NOBASE: + case PIPE_CAP_POLYGON_OFFSET_CLAMP: + case PIPE_CAP_MULTISAMPLE_Z_RESOLVE: + case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: + case PIPE_CAP_DEVICE_RESET_STATUS_QUERY: + case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS: return 0; /* SWTCL-only features. */ case PIPE_CAP_PRIMITIVE_RESTART: case PIPE_CAP_USER_VERTEX_BUFFERS: + case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: return !r300screen->caps.has_tcl; /* HWTCL-only features / limitations. */ @@ -172,10 +205,10 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: return r300screen->caps.has_tcl; + case PIPE_CAP_TGSI_TEXCOORD: + return 0; /* Texturing. */ - case PIPE_CAP_MAX_COMBINED_SAMPLERS: - return r300screen->caps.num_tex_units; case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: @@ -185,6 +218,25 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) /* Render targets. */ case PIPE_CAP_MAX_RENDER_TARGETS: return 4; + case PIPE_CAP_ENDIANNESS: + return PIPE_ENDIAN_LITTLE; + + case PIPE_CAP_MAX_VIEWPORTS: + return 1; + + case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE: + return 2048; + + case PIPE_CAP_VENDOR_ID: + return 0x1002; + case PIPE_CAP_DEVICE_ID: + return r300screen->info.pci_id; + case PIPE_CAP_ACCELERATED: + return 1; + case PIPE_CAP_VIDEO_MEMORY: + return r300screen->info.vram_size >> 20; + case PIPE_CAP_UMA: + return 0; } return 0; } @@ -218,17 +270,20 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e * additional texcoords but there is no two-sided color * selection then. However the facing bit can be used instead. */ return 10; - case PIPE_SHADER_CAP_MAX_CONSTS: - return is_r500 ? 256 : 32; + case PIPE_SHADER_CAP_MAX_OUTPUTS: + return 4; + case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: + return (is_r500 ? 256 : 32) * sizeof(float[4]); case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: + case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 1; case PIPE_SHADER_CAP_MAX_TEMPS: return is_r500 ? 128 : is_r400 ? 64 : 32; case PIPE_SHADER_CAP_MAX_PREDS: - return is_r500 ? 1 : 0; + return 0; /* unused */ case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: + case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: return r300screen->caps.num_tex_units; - case PIPE_SHADER_CAP_MAX_ADDRS: case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: @@ -237,6 +292,10 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: case PIPE_SHADER_CAP_SUBROUTINES: case PIPE_SHADER_CAP_INTEGERS: + case PIPE_SHADER_CAP_DOUBLES: + case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: + case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: + case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: return 0; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; @@ -246,6 +305,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e switch (param) { case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: + case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: case PIPE_SHADER_CAP_SUBROUTINES: return 0; default:; @@ -264,17 +324,18 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */ case PIPE_SHADER_CAP_MAX_INPUTS: return 16; - case PIPE_SHADER_CAP_MAX_CONSTS: - return 256; + case PIPE_SHADER_CAP_MAX_OUTPUTS: + return 10; + case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: + return 256 * sizeof(float[4]); case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: return 1; case PIPE_SHADER_CAP_MAX_TEMPS: return 32; - case PIPE_SHADER_CAP_MAX_ADDRS: - return 1; /* XXX guessed */ case PIPE_SHADER_CAP_MAX_PREDS: - return is_r500 ? 4 : 0; /* XXX guessed. */ + return 0; /* unused */ case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: + case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 1; case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: @@ -286,6 +347,11 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e case PIPE_SHADER_CAP_SUBROUTINES: case PIPE_SHADER_CAP_INTEGERS: case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: + case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: + case PIPE_SHADER_CAP_DOUBLES: + case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: + case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: + case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: return 0; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; @@ -322,8 +388,6 @@ static float r300_get_paramf(struct pipe_screen* pscreen, case PIPE_CAPF_GUARD_BAND_TOP: case PIPE_CAPF_GUARD_BAND_RIGHT: case PIPE_CAPF_GUARD_BAND_BOTTOM: - /* XXX I don't know what these should be but the least we can do is - * silence the potential error message */ return 0.0f; default: debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n", @@ -334,11 +398,12 @@ static float r300_get_paramf(struct pipe_screen* pscreen, static int r300_get_video_param(struct pipe_screen *screen, enum pipe_video_profile profile, + enum pipe_video_entrypoint entrypoint, enum pipe_video_cap param) { switch (param) { case PIPE_VIDEO_CAP_SUPPORTED: - return vl_profile_supported(screen, profile); + return vl_profile_supported(screen, profile, entrypoint); case PIPE_VIDEO_CAP_NPOT_TEXTURES: return 0; case PIPE_VIDEO_CAP_MAX_WIDTH: @@ -352,6 +417,8 @@ static int r300_get_video_param(struct pipe_screen *screen, return false; case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE: return true; + case PIPE_VIDEO_CAP_MAX_LEVEL: + return vl_level_supported(screen, profile); default: return 0; } @@ -383,6 +450,44 @@ util_format_is_rgba1010102_variant(const struct util_format_description *desc) return TRUE; } +static bool r300_is_blending_supported(struct r300_screen *rscreen, + enum pipe_format format) +{ + int c; + const struct util_format_description *desc = + util_format_description(format); + + if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) + return false; + + c = util_format_get_first_non_void_channel(format); + + /* RGBA16F */ + if (rscreen->caps.is_r500 && + desc->nr_channels == 4 && + desc->channel[c].size == 16 && + desc->channel[c].type == UTIL_FORMAT_TYPE_FLOAT) + return true; + + if (desc->channel[c].normalized && + desc->channel[c].type == UTIL_FORMAT_TYPE_UNSIGNED && + desc->channel[c].size >= 4 && + desc->channel[c].size <= 10) { + /* RGB10_A2, RGBA8, RGB5_A1, RGBA4, RGB565 */ + if (desc->nr_channels >= 3) + return true; + + if (format == PIPE_FORMAT_R8G8_UNORM) + return true; + + /* R8, I8, L8, A8 */ + if (desc->nr_channels == 1) + return true; + } + + return false; +} + static boolean r300_is_format_supported(struct pipe_screen* screen, enum pipe_format format, enum pipe_texture_target target, @@ -396,6 +501,7 @@ static boolean r300_is_format_supported(struct pipe_screen* screen, boolean is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM || format == PIPE_FORMAT_R10G10B10X2_SNORM || format == PIPE_FORMAT_B10G10R10A2_UNORM || + format == PIPE_FORMAT_B10G10R10X2_UNORM || format == PIPE_FORMAT_R10SG10SB10SA2U_NORM; boolean is_ati1n = format == PIPE_FORMAT_RGTC1_UNORM || format == PIPE_FORMAT_RGTC1_SNORM || @@ -410,11 +516,13 @@ static boolean r300_is_format_supported(struct pipe_screen* screen, format == PIPE_FORMAT_A16_FLOAT || format == PIPE_FORMAT_L16_FLOAT || format == PIPE_FORMAT_L16A16_FLOAT || + format == PIPE_FORMAT_R16A16_FLOAT || format == PIPE_FORMAT_I16_FLOAT; boolean is_half_float = format == PIPE_FORMAT_R16_FLOAT || format == PIPE_FORMAT_R16G16_FLOAT || format == PIPE_FORMAT_R16G16B16_FLOAT || - format == PIPE_FORMAT_R16G16B16A16_FLOAT; + format == PIPE_FORMAT_R16G16B16A16_FLOAT || + format == PIPE_FORMAT_R16G16B16X16_FLOAT; const struct util_format_description *desc; if (!util_format_is_supported(format, usage)) @@ -432,11 +540,6 @@ static boolean r300_is_format_supported(struct pipe_screen* screen, if (!drm_2_8_0) { return FALSE; } - /* Only support R500, because I didn't test older chipsets, - * but MSAA should work there too. */ - if (!is_r500 && !debug_get_bool_option("RADEON_MSAA", FALSE)) { - return FALSE; - } /* No texturing and scanout. */ if (usage & (PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DISPLAY_TARGET | @@ -451,7 +554,8 @@ static boolean r300_is_format_supported(struct pipe_screen* screen, if (!util_format_is_depth_or_stencil(format) && !util_format_is_rgba8_variant(desc) && !util_format_is_rgba1010102_variant(desc) && - format != PIPE_FORMAT_R16G16B16A16_FLOAT) { + format != PIPE_FORMAT_R16G16B16A16_FLOAT && + format != PIPE_FORMAT_R16G16B16X16_FLOAT) { return FALSE; } } else { @@ -485,7 +589,8 @@ static boolean r300_is_format_supported(struct pipe_screen* screen, if ((usage & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | - PIPE_BIND_SHARED)) && + PIPE_BIND_SHARED | + PIPE_BIND_BLENDABLE)) && /* 2101010 cannot be rendered to on non-r5xx. */ (!is_color2101010 || (is_r500 && drm_2_8_0)) && r300_is_colorbuffer_format_supported(format)) { @@ -494,6 +599,10 @@ static boolean r300_is_format_supported(struct pipe_screen* screen, PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_SHARED); + + if (r300_is_blending_supported(r300_screen(screen), format)) { + retval |= usage & PIPE_BIND_BLENDABLE; + } } /* Check depth-stencil format support. */ @@ -532,6 +641,9 @@ static void r300_destroy_screen(struct pipe_screen* pscreen) struct r300_screen* r300screen = r300_screen(pscreen); struct radeon_winsys *rws = radeon_winsys(pscreen); + if (rws && !rws->unref(rws)) + return; + pipe_mutex_destroy(r300screen->cmask_mutex); if (rws) @@ -543,18 +655,10 @@ static void r300_destroy_screen(struct pipe_screen* pscreen) static void r300_fence_reference(struct pipe_screen *screen, struct pipe_fence_handle **ptr, struct pipe_fence_handle *fence) -{ - pb_reference((struct pb_buffer**)ptr, - (struct pb_buffer*)fence); -} - -static boolean r300_fence_signalled(struct pipe_screen *screen, - struct pipe_fence_handle *fence) { struct radeon_winsys *rws = r300_screen(screen)->rws; - struct pb_buffer *rfence = (struct pb_buffer*)fence; - return !rws->buffer_is_busy(rfence, RADEON_USAGE_READWRITE); + rws->fence_reference(ptr, fence); } static boolean r300_fence_finish(struct pipe_screen *screen, @@ -562,26 +666,8 @@ static boolean r300_fence_finish(struct pipe_screen *screen, uint64_t timeout) { struct radeon_winsys *rws = r300_screen(screen)->rws; - struct pb_buffer *rfence = (struct pb_buffer*)fence; - - if (timeout != PIPE_TIMEOUT_INFINITE) { - int64_t start_time = os_time_get(); - - /* Convert to microseconds. */ - timeout /= 1000; - - /* Wait in a loop. */ - while (rws->buffer_is_busy(rfence, RADEON_USAGE_READWRITE)) { - if (os_time_get() - start_time >= timeout) { - return FALSE; - } - os_time_sleep(10); - } - return TRUE; - } - rws->buffer_wait(rfence, RADEON_USAGE_READWRITE); - return TRUE; + return rws->fence_wait(rws, fence, timeout); } struct pipe_screen* r300_screen_create(struct radeon_winsys *rws) @@ -610,6 +696,7 @@ struct pipe_screen* r300_screen_create(struct radeon_winsys *rws) r300screen->screen.destroy = r300_destroy_screen; r300screen->screen.get_name = r300_get_name; r300screen->screen.get_vendor = r300_get_vendor; + r300screen->screen.get_device_vendor = r300_get_device_vendor; r300screen->screen.get_param = r300_get_param; r300screen->screen.get_shader_param = r300_get_shader_param; r300screen->screen.get_paramf = r300_get_paramf; @@ -618,7 +705,6 @@ struct pipe_screen* r300_screen_create(struct radeon_winsys *rws) r300screen->screen.is_video_format_supported = vl_video_buffer_is_format_supported; r300screen->screen.context_create = r300_create_context; r300screen->screen.fence_reference = r300_fence_reference; - r300screen->screen.fence_signalled = r300_fence_signalled; r300screen->screen.fence_finish = r300_fence_finish; r300_init_screen_resource_functions(r300screen);