swr: calculate viewport width/height based on the scale
[mesa.git] / src / gallium / drivers / swr / swr_screen.cpp
index fa16edd1250ad5fe4407cf2f526a123ef7861d9f..9723c40adf2f81a3784d47e3d2c6a24f8f0cb7d2 100644 (file)
  * IN THE SOFTWARE.
  ***************************************************************************/
 
+#include "swr_context.h"
+#include "swr_public.h"
+#include "swr_screen.h"
+#include "swr_resource.h"
+#include "swr_fence.h"
+#include "gen_knobs.h"
+
 #include "pipe/p_screen.h"
 #include "pipe/p_defines.h"
 #include "util/u_memory.h"
@@ -35,13 +42,6 @@ extern "C" {
 #include "gallivm/lp_bld_limits.h"
 }
 
-#include "swr_public.h"
-#include "swr_screen.h"
-#include "swr_context.h"
-#include "swr_resource.h"
-#include "swr_fence.h"
-#include "gen_knobs.h"
-
 #include "jit_api.h"
 
 #include <stdio.h>
@@ -214,7 +214,7 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_PRIMITIVE_RESTART:
       return 1;
    case PIPE_CAP_SHADER_STENCIL_EXPORT:
-      return 1;
+      return 0;
    case PIPE_CAP_TGSI_INSTANCEID:
    case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
    case PIPE_CAP_START_INSTANCE:
@@ -233,8 +233,9 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TEXTURE_BARRIER:
       return 0;
    case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
-   case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: /* draw module */
-   case PIPE_CAP_VERTEX_COLOR_CLAMPED: /* draw module */
+   case PIPE_CAP_VERTEX_COLOR_CLAMPED:
+      return 0;
+   case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
       return 1;
    case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
       return 1;
@@ -249,10 +250,10 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_USER_CONSTANT_BUFFERS:
    case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
    case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
-   case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
       return 1;
    case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
       return 16;
+   case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
    case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
    case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
    case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
@@ -545,7 +546,7 @@ mesa_to_swr_format(enum pipe_format format)
       {PIPE_FORMAT_B5G5R5X1_UNORM,         B5G5R5X1_UNORM},
       {PIPE_FORMAT_R10G10B10A2_USCALED,    R10G10B10A2_USCALED},
       {PIPE_FORMAT_R11G11B10_FLOAT,        R11G11B10_FLOAT},
-      {PIPE_FORMAT_R9G9B9E5_FLOAT,         R9G9B9E5_SHAREDEXP},
+      {PIPE_FORMAT_R9G9B9E5_FLOAT,         (SWR_FORMAT)-1},
       {PIPE_FORMAT_Z32_FLOAT_S8X24_UINT,   R32_FLOAT_X8X24_TYPELESS}, // z
       {PIPE_FORMAT_R1_UNORM,               (SWR_FORMAT)-1},
       {PIPE_FORMAT_R10G10B10X2_USCALED,    R10G10B10X2_USCALED},
@@ -796,8 +797,9 @@ swr_texture_layout(struct swr_screen *screen,
          res->alignedHeight = alignedHeight;
       }
 
-      res->row_stride[level] = alignedWidth * finfo.Bpp;
-      res->img_stride[level] = res->row_stride[level] * alignedHeight;
+      res->row_stride[level] = util_format_get_stride(fmt, alignedWidth);
+      res->img_stride[level] =
+         res->row_stride[level] * util_format_get_nblocksy(fmt, alignedHeight);
       res->mip_offsets[level] = total_size;
 
       if (pt->target == PIPE_TEXTURE_3D)
@@ -984,7 +986,7 @@ swr_destroy_screen(struct pipe_screen *p_screen)
 
 PUBLIC
 struct pipe_screen *
-swr_create_screen(struct sw_winsys *winsys)
+swr_create_screen_internal(struct sw_winsys *winsys)
 {
    struct swr_screen *screen = CALLOC_STRUCT(swr_screen);
 
@@ -1021,14 +1023,3 @@ swr_create_screen(struct sw_winsys *winsys)
    return &screen->base;
 }
 
-struct sw_winsys *
-swr_get_winsys(struct pipe_screen *pipe)
-{
-   return ((struct swr_screen *)pipe)->winsys;
-}
-
-struct sw_displaytarget *
-swr_get_displaytarget(struct pipe_resource *resource)
-{
-   return ((struct swr_resource *)resource)->display_target;
-}