Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2008 VMware, Inc.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28.  
  29. #include "util/u_memory.h"
  30. #include "util/u_format.h"
  31. #include "util/u_format_s3tc.h"
  32. #include "util/u_video.h"
  33. #include "os/os_misc.h"
  34. #include "os/os_time.h"
  35. #include "pipe/p_defines.h"
  36. #include "pipe/p_screen.h"
  37. #include "draw/draw_context.h"
  38.  
  39. #include "state_tracker/sw_winsys.h"
  40. #include "tgsi/tgsi_exec.h"
  41.  
  42. #include "sp_texture.h"
  43. #include "sp_screen.h"
  44. #include "sp_context.h"
  45. #include "sp_fence.h"
  46. #include "sp_public.h"
  47.  
  48. DEBUG_GET_ONCE_BOOL_OPTION(use_llvm, "SOFTPIPE_USE_LLVM", FALSE)
  49.  
  50. static const char *
  51. softpipe_get_vendor(struct pipe_screen *screen)
  52. {
  53.    return "VMware, Inc.";
  54. }
  55.  
  56.  
  57. static const char *
  58. softpipe_get_name(struct pipe_screen *screen)
  59. {
  60.    return "softpipe";
  61. }
  62.  
  63.  
  64. static int
  65. softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
  66. {
  67.    switch (param) {
  68.    case PIPE_CAP_NPOT_TEXTURES:
  69.    case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
  70.       return 1;
  71.    case PIPE_CAP_TWO_SIDED_STENCIL:
  72.       return 1;
  73.    case PIPE_CAP_SM3:
  74.       return 1;
  75.    case PIPE_CAP_ANISOTROPIC_FILTER:
  76.       return 1;
  77.    case PIPE_CAP_POINT_SPRITE:
  78.       return 1;
  79.    case PIPE_CAP_MAX_RENDER_TARGETS:
  80.       return PIPE_MAX_COLOR_BUFS;
  81.    case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
  82.       return 1;
  83.    case PIPE_CAP_OCCLUSION_QUERY:
  84.       return 1;
  85.    case PIPE_CAP_QUERY_TIME_ELAPSED:
  86.       return 1;
  87.    case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
  88.       return 1;
  89.    case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
  90.       return 1;
  91.    case PIPE_CAP_TEXTURE_SHADOW_MAP:
  92.       return 1;
  93.    case PIPE_CAP_TEXTURE_SWIZZLE:
  94.       return 1;
  95.    case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
  96.       return 0;
  97.    case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
  98.       return SP_MAX_TEXTURE_2D_LEVELS;
  99.    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
  100.       return SP_MAX_TEXTURE_3D_LEVELS;
  101.    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
  102.       return SP_MAX_TEXTURE_CUBE_LEVELS;
  103.    case PIPE_CAP_BLEND_EQUATION_SEPARATE:
  104.       return 1;
  105.    case PIPE_CAP_INDEP_BLEND_ENABLE:
  106.       return 1;
  107.    case PIPE_CAP_INDEP_BLEND_FUNC:
  108.       return 1;
  109.    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
  110.    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
  111.    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
  112.    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
  113.       return 1;
  114.    case PIPE_CAP_DEPTH_CLIP_DISABLE:
  115.       return 1;
  116.    case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
  117.       return PIPE_MAX_SO_BUFFERS;
  118.    case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
  119.    case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
  120.       return 16*4;
  121.    case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
  122.    case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
  123.       return 1024;
  124.    case PIPE_CAP_MAX_VERTEX_STREAMS:
  125.       return 1;
  126.    case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
  127.       return 2048;
  128.    case PIPE_CAP_PRIMITIVE_RESTART:
  129.       return 1;
  130.    case PIPE_CAP_SHADER_STENCIL_EXPORT:
  131.       return 1;
  132.    case PIPE_CAP_TGSI_INSTANCEID:
  133.    case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
  134.    case PIPE_CAP_START_INSTANCE:
  135.       return 1;
  136.    case PIPE_CAP_SEAMLESS_CUBE_MAP:
  137.    case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
  138.       return 1;
  139.    case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
  140.       return 256; /* for GL3 */
  141.    case PIPE_CAP_MIN_TEXEL_OFFSET:
  142.       return -8;
  143.    case PIPE_CAP_MAX_TEXEL_OFFSET:
  144.       return 7;
  145.    case PIPE_CAP_CONDITIONAL_RENDER:
  146.       return 1;
  147.    case PIPE_CAP_TEXTURE_BARRIER:
  148.       return 0;
  149.    case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
  150.    case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: /* draw module */
  151.    case PIPE_CAP_VERTEX_COLOR_CLAMPED: /* draw module */
  152.       return 1;
  153.    case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
  154.       return 0;
  155.    case PIPE_CAP_GLSL_FEATURE_LEVEL:
  156.       return 330;
  157.    case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
  158.       return 0;
  159.    case PIPE_CAP_COMPUTE:
  160.       return 0;
  161.    case PIPE_CAP_USER_VERTEX_BUFFERS:
  162.    case PIPE_CAP_USER_INDEX_BUFFERS:
  163.    case PIPE_CAP_USER_CONSTANT_BUFFERS:
  164.    case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
  165.    case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
  166.       return 1;
  167.    case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
  168.       return 16;
  169.    case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
  170.    case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
  171.    case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
  172.    case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
  173.    case PIPE_CAP_TEXTURE_MULTISAMPLE:
  174.       return 0;
  175.    case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
  176.       return 64;
  177.    case PIPE_CAP_QUERY_TIMESTAMP:
  178.    case PIPE_CAP_CUBE_MAP_ARRAY:
  179.       return 1;
  180.    case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
  181.       return 1;
  182.    case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
  183.       return 65536;
  184.    case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
  185.       return 0;
  186.    case PIPE_CAP_TGSI_TEXCOORD:
  187.    case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
  188.       return 0;
  189.    case PIPE_CAP_MAX_VIEWPORTS:
  190.       return 1;
  191.    case PIPE_CAP_ENDIANNESS:
  192.       return PIPE_ENDIAN_NATIVE;
  193.    case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
  194.    case PIPE_CAP_TEXTURE_GATHER_SM5:
  195.    case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
  196.    case PIPE_CAP_TEXTURE_QUERY_LOD:
  197.    case PIPE_CAP_SAMPLE_SHADING:
  198.    case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
  199.       return 0;
  200.    case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
  201.       return 1;
  202.    case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
  203.       return 0;
  204.    case PIPE_CAP_SAMPLER_VIEW_TARGET:
  205.       return 1;
  206.    case PIPE_CAP_FAKE_SW_MSAA:
  207.       return 1;
  208.    case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
  209.    case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
  210.       return 0;
  211.    case PIPE_CAP_DRAW_INDIRECT:
  212.       return 1;
  213.  
  214.    case PIPE_CAP_VENDOR_ID:
  215.       return 0xFFFFFFFF;
  216.    case PIPE_CAP_DEVICE_ID:
  217.       return 0xFFFFFFFF;
  218.    case PIPE_CAP_ACCELERATED:
  219.       return 0;
  220.    case PIPE_CAP_VIDEO_MEMORY: {
  221.       /* XXX: Do we want to return the full amount fo system memory ? */
  222.       uint64_t system_memory;
  223.  
  224.       if (!os_get_total_physical_memory(&system_memory))
  225.          return 0;
  226.  
  227.       return (int)(system_memory >> 20);
  228.    }
  229.    case PIPE_CAP_UMA:
  230.       return 0;
  231.    case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
  232.       return 1;
  233.    case PIPE_CAP_CLIP_HALFZ:
  234.       return 1;
  235.    case PIPE_CAP_VERTEXID_NOBASE:
  236.       return 0;
  237.    case PIPE_CAP_POLYGON_OFFSET_CLAMP:
  238.       return 0;
  239.    case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
  240.    case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
  241.    case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
  242.       return 0;
  243.    }
  244.    /* should only get here on unhandled cases */
  245.    debug_printf("Unexpected PIPE_CAP %d query\n", param);
  246.    return 0;
  247. }
  248.  
  249. static int
  250. softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param)
  251. {
  252.    struct softpipe_screen *sp_screen = softpipe_screen(screen);
  253.    switch(shader)
  254.    {
  255.    case PIPE_SHADER_FRAGMENT:
  256.       return tgsi_exec_get_shader_param(param);
  257.    case PIPE_SHADER_VERTEX:
  258.    case PIPE_SHADER_GEOMETRY:
  259.       if (sp_screen->use_llvm)
  260.          return draw_get_shader_param(shader, param);
  261.       else
  262.          return draw_get_shader_param_no_llvm(shader, param);
  263.    default:
  264.       return 0;
  265.    }
  266. }
  267.  
  268. static float
  269. softpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
  270. {
  271.    switch (param) {
  272.    case PIPE_CAPF_MAX_LINE_WIDTH:
  273.       /* fall-through */
  274.    case PIPE_CAPF_MAX_LINE_WIDTH_AA:
  275.       return 255.0; /* arbitrary */
  276.    case PIPE_CAPF_MAX_POINT_WIDTH:
  277.       /* fall-through */
  278.    case PIPE_CAPF_MAX_POINT_WIDTH_AA:
  279.       return 255.0; /* arbitrary */
  280.    case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
  281.       return 16.0;
  282.    case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
  283.       return 16.0; /* arbitrary */
  284.    case PIPE_CAPF_GUARD_BAND_LEFT:
  285.    case PIPE_CAPF_GUARD_BAND_TOP:
  286.    case PIPE_CAPF_GUARD_BAND_RIGHT:
  287.    case PIPE_CAPF_GUARD_BAND_BOTTOM:
  288.       return 0.0;
  289.    }
  290.    /* should only get here on unhandled cases */
  291.    debug_printf("Unexpected PIPE_CAPF %d query\n", param);
  292.    return 0.0;
  293. }
  294.  
  295. /**
  296.  * Query format support for creating a texture, drawing surface, etc.
  297.  * \param format  the format to test
  298.  * \param type  one of PIPE_TEXTURE, PIPE_SURFACE
  299.  */
  300. static boolean
  301. softpipe_is_format_supported( struct pipe_screen *screen,
  302.                               enum pipe_format format,
  303.                               enum pipe_texture_target target,
  304.                               unsigned sample_count,
  305.                               unsigned bind)
  306. {
  307.    struct sw_winsys *winsys = softpipe_screen(screen)->winsys;
  308.    const struct util_format_description *format_desc;
  309.  
  310.    assert(target == PIPE_BUFFER ||
  311.           target == PIPE_TEXTURE_1D ||
  312.           target == PIPE_TEXTURE_1D_ARRAY ||
  313.           target == PIPE_TEXTURE_2D ||
  314.           target == PIPE_TEXTURE_2D_ARRAY ||
  315.           target == PIPE_TEXTURE_RECT ||
  316.           target == PIPE_TEXTURE_3D ||
  317.           target == PIPE_TEXTURE_CUBE ||
  318.           target == PIPE_TEXTURE_CUBE_ARRAY);
  319.  
  320.    format_desc = util_format_description(format);
  321.    if (!format_desc)
  322.       return FALSE;
  323.  
  324.    if (sample_count > 1)
  325.       return FALSE;
  326.  
  327.    if (bind & (PIPE_BIND_DISPLAY_TARGET |
  328.                PIPE_BIND_SCANOUT |
  329.                PIPE_BIND_SHARED)) {
  330.       if(!winsys->is_displaytarget_format_supported(winsys, bind, format))
  331.          return FALSE;
  332.    }
  333.  
  334.    if (bind & PIPE_BIND_RENDER_TARGET) {
  335.       if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS)
  336.          return FALSE;
  337.  
  338.       /*
  339.        * Although possible, it is unnatural to render into compressed or YUV
  340.        * surfaces. So disable these here to avoid going into weird paths
  341.        * inside the state trackers.
  342.        */
  343.       if (format_desc->block.width != 1 ||
  344.           format_desc->block.height != 1)
  345.          return FALSE;
  346.    }
  347.  
  348.    if (bind & PIPE_BIND_DEPTH_STENCIL) {
  349.       if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
  350.          return FALSE;
  351.    }
  352.  
  353.    if (format_desc->layout == UTIL_FORMAT_LAYOUT_BPTC) {
  354.       /* Software decoding is not hooked up. */
  355.       return FALSE;
  356.    }
  357.  
  358.    if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC &&
  359.        format != PIPE_FORMAT_ETC1_RGB8)
  360.       return FALSE;
  361.  
  362.    /*
  363.     * All other operations (sampling, transfer, etc).
  364.     */
  365.  
  366.    if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
  367.       return util_format_s3tc_enabled;
  368.    }
  369.  
  370.    /*
  371.     * Everything else should be supported by u_format.
  372.     */
  373.    return TRUE;
  374. }
  375.  
  376.  
  377. static void
  378. softpipe_destroy_screen( struct pipe_screen *screen )
  379. {
  380.    struct softpipe_screen *sp_screen = softpipe_screen(screen);
  381.    struct sw_winsys *winsys = sp_screen->winsys;
  382.  
  383.    if(winsys->destroy)
  384.       winsys->destroy(winsys);
  385.  
  386.    FREE(screen);
  387. }
  388.  
  389.  
  390. /* This is often overriden by the co-state tracker.
  391.  */
  392. static void
  393. softpipe_flush_frontbuffer(struct pipe_screen *_screen,
  394.                            struct pipe_resource *resource,
  395.                            unsigned level, unsigned layer,
  396.                            void *context_private,
  397.                            struct pipe_box *sub_box)
  398. {
  399.    struct softpipe_screen *screen = softpipe_screen(_screen);
  400.    struct sw_winsys *winsys = screen->winsys;
  401.    struct softpipe_resource *texture = softpipe_resource(resource);
  402.  
  403.    assert(texture->dt);
  404.    if (texture->dt)
  405.       winsys->displaytarget_display(winsys, texture->dt, context_private, sub_box);
  406. }
  407.  
  408. static uint64_t
  409. softpipe_get_timestamp(struct pipe_screen *_screen)
  410. {
  411.    return os_time_get_nano();
  412. }
  413.  
  414. /**
  415.  * Create a new pipe_screen object
  416.  * Note: we're not presently subclassing pipe_screen (no softpipe_screen).
  417.  */
  418. struct pipe_screen *
  419. softpipe_create_screen(struct sw_winsys *winsys)
  420. {
  421.    struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen);
  422.  
  423.    if (!screen)
  424.       return NULL;
  425.  
  426.    screen->winsys = winsys;
  427.  
  428.    screen->base.destroy = softpipe_destroy_screen;
  429.  
  430.    screen->base.get_name = softpipe_get_name;
  431.    screen->base.get_vendor = softpipe_get_vendor;
  432.    screen->base.get_device_vendor = softpipe_get_vendor; // TODO should be the CPU vendor
  433.    screen->base.get_param = softpipe_get_param;
  434.    screen->base.get_shader_param = softpipe_get_shader_param;
  435.    screen->base.get_paramf = softpipe_get_paramf;
  436.    screen->base.get_timestamp = softpipe_get_timestamp;
  437.    screen->base.is_format_supported = softpipe_is_format_supported;
  438.    screen->base.context_create = softpipe_create_context;
  439.    screen->base.flush_frontbuffer = softpipe_flush_frontbuffer;
  440.  
  441.    screen->use_llvm = debug_get_option_use_llvm();
  442.  
  443.    util_format_s3tc_init();
  444.  
  445.    softpipe_init_screen_texture_funcs(&screen->base);
  446.    softpipe_init_screen_fence_funcs(&screen->base);
  447.  
  448.    return &screen->base;
  449. }
  450.