Since the whole patent mess can't apply to floating vertices here are some 
gallium patches.

First adds a new screen interface for is_vertex_format_supported and also
we seems to have some GPUs with a single R16 and some with R16X16 so allow 
or this.

second is just i965g patch.

If these are okay, I can look at softpipe support via translate. Not sure 
exposing this extension always and using translate always makes sense as 
it defeats the purpose of this extension.

Dave.
From b8ea9848a61fe2469ae87bdc8ba44ea40b25b8ef Mon Sep 17 00:00:00 2001
From: Dave Airlie <airl...@linux.ie>
Date: Tue, 26 Jan 2010 19:12:36 +1000
Subject: [PATCH 2/2] i965g: add support for ARB_half_float_vertex

This adds the format bits to the 965g vertex emission. Untested
due to 965g appearing to smash my GPU currently.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 src/gallium/drivers/i965/brw_draw_upload.c |    9 +++++++++
 src/gallium/drivers/i965/brw_screen.c      |   21 +++++++++++++++++++++
 2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/src/gallium/drivers/i965/brw_draw_upload.c b/src/gallium/drivers/i965/brw_draw_upload.c
index a27da5f..4ca75e0 100644
--- a/src/gallium/drivers/i965/brw_draw_upload.c
+++ b/src/gallium/drivers/i965/brw_draw_upload.c
@@ -170,6 +170,15 @@ static unsigned brw_translate_surface_format( unsigned id )
    case PIPE_FORMAT_R8G8B8A8_SSCALED:
       return BRW_SURFACEFORMAT_R8G8B8A8_SSCALED;
 
+   case PIPE_FORMAT_R16_FLOAT:
+      return BRW_SURFACEFORMAT_R16_FLOAT;
+   case PIPE_FORMAT_R16G16_FLOAT:
+      return BRW_SURFACEFORMAT_R16G16_FLOAT;
+   case PIPE_FORMAT_R16G16B16X16_FLOAT:
+      return BRW_SURFACEFORMAT_R16G16B16X16_FLOAT;
+   case PIPE_FORMAT_R16G16B16A16_FLOAT:
+      return BRW_SURFACEFORMAT_R16G16B16A16_FLOAT;
+
    default:
       assert(0);
       return 0;
diff --git a/src/gallium/drivers/i965/brw_screen.c b/src/gallium/drivers/i965/brw_screen.c
index 0ecacac..d3505cb 100644
--- a/src/gallium/drivers/i965/brw_screen.c
+++ b/src/gallium/drivers/i965/brw_screen.c
@@ -203,6 +203,26 @@ brw_get_paramf(struct pipe_screen *screen, int param)
 }
 
 static boolean
+brw_is_vertex_format_supported(struct pipe_screen *screen,
+			       enum pipe_format format)
+{
+   static const GLuint pipe_format_extra[] = {
+      PIPE_FORMAT_R16_FLOAT,
+      PIPE_FORMAT_R16G16_FLOAT,
+      PIPE_FORMAT_R16G16B16X16_FLOAT,
+      PIPE_FORMAT_R16G16B16A16_FLOAT,
+      PIPE_FORMAT_NONE,
+   };
+   int i;
+
+   for (i = 0; pipe_format_extra[i] != PIPE_FORMAT_NONE; i++) {
+      if (pipe_format_extra[i] == format)
+	 return TRUE;
+   }
+   return FALSE;
+}
+
+static boolean
 brw_is_format_supported(struct pipe_screen *screen,
                          enum pipe_format format, 
                          enum pipe_texture_target target,
@@ -387,6 +407,7 @@ brw_create_screen(struct brw_winsys_screen *sws, uint pci_id)
    bscreen->base.get_vendor = brw_get_vendor;
    bscreen->base.get_param = brw_get_param;
    bscreen->base.get_paramf = brw_get_paramf;
+   bscreen->base.is_vertex_format_supported = brw_is_vertex_format_supported;
    bscreen->base.is_format_supported = brw_is_format_supported;
    bscreen->base.fence_reference = brw_fence_reference;
    bscreen->base.fence_signalled = brw_fence_signalled;
-- 
1.6.5.2

From 0b0624f0530c9825f72bf1e1af1993d2749c5ce5 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airl...@linux.ie>
Date: Tue, 26 Jan 2010 19:10:06 +1000
Subject: [PATCH 1/2] gallium: add support for ARB_half_float_vertex

This adds a new screen interface, is_vertex_format_supported which we
used to query for the different half float vertex types, from Luca's reading
of NV30 docs it appears we need an R16X16 as well as R16.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 src/gallium/include/pipe/p_format.h    |    6 ++++++
 src/gallium/include/pipe/p_screen.h    |    9 +++++++++
 src/mesa/state_tracker/st_draw.c       |   14 +++++++++++++-
 src/mesa/state_tracker/st_draw.h       |    2 ++
 src/mesa/state_tracker/st_extensions.c |   13 +++++++++++++
 5 files changed, 43 insertions(+), 1 deletions(-)

diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
index 6bfff1c..d3af65a 100644
--- a/src/gallium/include/pipe/p_format.h
+++ b/src/gallium/include/pipe/p_format.h
@@ -166,6 +166,12 @@ enum pipe_format {
    PIPE_FORMAT_DXT3_SRGBA            = 108,
    PIPE_FORMAT_DXT5_SRGBA            = 109,
 
+   /* based on DX formats + R16X16 for nv30 */
+   PIPE_FORMAT_R16_FLOAT             = 110,
+   PIPE_FORMAT_R16X16_FLOAT          = 111,
+   PIPE_FORMAT_R16G16_FLOAT          = 112,
+   PIPE_FORMAT_R16G16B16X16_FLOAT    = 113,
+   PIPE_FORMAT_R16G16B16A16_FLOAT    = 114,
    PIPE_FORMAT_COUNT
 };
 
diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h
index b8e001a..887d527 100644
--- a/src/gallium/include/pipe/p_screen.h
+++ b/src/gallium/include/pipe/p_screen.h
@@ -87,6 +87,15 @@ struct pipe_screen {
    float (*get_paramf)( struct pipe_screen *, int param );
 
    /**
+    * Check if the given pipe format is supported as a vertex
+    * format.
+    */
+   boolean (*is_vertex_format_supported)( struct pipe_screen *,
+					  enum pipe_format format );
+
+
+
+   /**
     * Check if the given pipe_format is supported as a texture or
     * drawing surface.
     * \param tex_usage  bitmask of PIPE_TEXTURE_USAGE_*
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index b0d5b99..3bc52a4 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -72,6 +72,13 @@ static GLuint float_types[4] = {
    PIPE_FORMAT_R32G32B32A32_FLOAT
 };
 
+static GLuint half_float_types[4] = {
+   0,
+   PIPE_FORMAT_R16G16_FLOAT,
+   PIPE_FORMAT_R16G16B16X16_FLOAT,
+   PIPE_FORMAT_R16G16B16A16_FLOAT
+};
+
 static GLuint uint_types_norm[4] = {
    PIPE_FORMAT_R32_UNORM,
    PIPE_FORMAT_R32G32_UNORM,
@@ -163,7 +170,10 @@ static GLuint fixed_types[4] = {
    PIPE_FORMAT_R32G32B32A32_FIXED
 };
 
-
+void st_draw_set_half_float_format(GLuint type0)
+{
+   half_float_types[0] = type0;
+}
 
 /**
  * Return a PIPE_FORMAT_x for the given GL datatype and size.
@@ -189,6 +199,7 @@ st_pipe_vertex_format(GLenum type, GLuint size, GLenum format,
       switch (type) {
       case GL_DOUBLE: return double_types[size-1];
       case GL_FLOAT: return float_types[size-1];
+      case GL_HALF_FLOAT: return half_float_types[size-1];
       case GL_INT: return int_types_norm[size-1];
       case GL_SHORT: return short_types_norm[size-1];
       case GL_BYTE: return byte_types_norm[size-1];
@@ -203,6 +214,7 @@ st_pipe_vertex_format(GLenum type, GLuint size, GLenum format,
       switch (type) {
       case GL_DOUBLE: return double_types[size-1];
       case GL_FLOAT: return float_types[size-1];
+      case GL_HALF_FLOAT: return half_float_types[size-1];
       case GL_INT: return int_types_scale[size-1];
       case GL_SHORT: return short_types_scale[size-1];
       case GL_BYTE: return byte_types_scale[size-1];
diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h
index 3e0face..7d672bd 100644
--- a/src/mesa/state_tracker/st_draw.h
+++ b/src/mesa/state_tracker/st_draw.h
@@ -41,6 +41,8 @@ void st_init_draw( struct st_context *st );
 
 void st_destroy_draw( struct st_context *st );
 
+void st_draw_set_half_float_format(GLuint type0);
+
 extern void
 st_draw_vbo(GLcontext *ctx,
             const struct gl_client_array **arrays,
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 89a16c1..98021ee 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -35,6 +35,7 @@
 #include "pipe/p_screen.h"
 
 #include "st_context.h"
+#include "st_draw.h"
 #include "st_extensions.h"
 
 
@@ -257,6 +258,18 @@ void st_init_extensions(struct st_context *st)
       /*ctx->Extensions.ARB_shadow_ambient = GL_TRUE;*/
    }
 
+   if (screen->is_vertex_format_supported) {
+      if (screen->is_vertex_format_supported(screen, PIPE_FORMAT_R16G16B16A16_FLOAT) &&
+       screen->is_vertex_format_supported(screen, PIPE_FORMAT_R16G16B16X16_FLOAT) &&
+	  screen->is_vertex_format_supported(screen, PIPE_FORMAT_R16G16_FLOAT))
+	 ctx->Extensions.ARB_half_float_vertex = GL_TRUE;
+      
+      if (screen->is_vertex_format_supported(screen, PIPE_FORMAT_R16X16_FLOAT))
+	 st_draw_set_half_float_format(PIPE_FORMAT_R16X16_FLOAT);
+      if (screen->is_vertex_format_supported(screen, PIPE_FORMAT_R16_FLOAT))
+	 st_draw_set_half_float_format(PIPE_FORMAT_R16_FLOAT);
+   }
+					  
    /* GL_EXT_packed_depth_stencil requires both the ability to render to
     * a depth/stencil buffer and texture from depth/stencil source.
     */
-- 
1.6.5.2

------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to