From 4e86a052252891b39d6abf6111d63910e831fa6e Mon Sep 17 00:00:00 2001
From: twinaphex <autechre1024@hotmail.com>
Date: Sat, 30 Mar 2013 06:36:04 +0100
Subject: [PATCH] (RGL PS3) Integrate rglFifoGlVertexAttribPointer into
 glDrawArrays

---
 ps3/rgl/include/RGL/Utils.h          |  3 +-
 ps3/rgl/src/ps3/include/rgl-inline.h | 65 ----------------------------
 ps3/rgl/src/ps3/rgl_ps3_raster.cpp   | 60 +++++++++++++++++++++++--
 3 files changed, 57 insertions(+), 71 deletions(-)

diff --git a/ps3/rgl/include/RGL/Utils.h b/ps3/rgl/include/RGL/Utils.h
index 02300b6a7e..a41e9c19ea 100644
--- a/ps3/rgl/include/RGL/Utils.h
+++ b/ps3/rgl/include/RGL/Utils.h
@@ -84,8 +84,7 @@ extern "C" {
 
    static inline void *rglGetNamedValue(void *data, unsigned int name )
    {
-      struct rglNameSpace *ns = (struct rglNameSpace*)data;
-      return ns->data[name - 1];
+      return ((struct rglNameSpace*)data)->data[name - 1];
    }
 
    void rglTexNameSpaceInit(void *data, rglTexNameSpaceCreateFunction create, rglTexNameSpaceDestroyFunction destroy );
diff --git a/ps3/rgl/src/ps3/include/rgl-inline.h b/ps3/rgl/src/ps3/include/rgl-inline.h
index da6fd0ff9e..699c2d7579 100644
--- a/ps3/rgl/src/ps3/include/rgl-inline.h
+++ b/ps3/rgl/src/ps3/include/rgl-inline.h
@@ -288,71 +288,6 @@ static inline void rglGcmFifoGlIncFenceRef (GLuint *ref)
    *ref = rglGcmFifoPutReference( fifo );
 }
 
-static inline void rglGcmFifoGlVertexAttribPointer
-(
- GLuint          index,
- GLint           size,
- rglGcmEnum       type,
- GLboolean       normalized,
- GLsizei         stride,
- GLushort        frequency,
- GLuint          offset
- )
-{
-   // syntax check
-   switch ( size )
-   {
-      case 0: // disable
-         stride = 0;
-         normalized = 0;
-         type = RGLGCM_FLOAT;
-         offset = 0;
-         break;
-      case 1:
-      case 2:
-      case 3:
-      case 4:
-         // valid
-         break;
-      default:
-         break;
-   }
-
-   // mapping to native types
-   uint8_t gcmType = 0;
-   switch ( type )
-   {
-      case RGLGCM_UNSIGNED_BYTE:
-         if (normalized)
-            gcmType = CELL_GCM_VERTEX_UB;
-         else
-            gcmType = CELL_GCM_VERTEX_UB256;
-         break;
-
-      case RGLGCM_SHORT:
-         gcmType = normalized ? CELL_GCM_VERTEX_S1 : CELL_GCM_VERTEX_S32K;
-         break;
-
-      case RGLGCM_FLOAT:
-         gcmType = CELL_GCM_VERTEX_F;
-         break;
-
-      case RGLGCM_HALF_FLOAT:
-         gcmType = CELL_GCM_VERTEX_SF;
-         break;
-
-      case RGLGCM_CMP:
-         size = 1;   // required for this format
-         gcmType = CELL_GCM_VERTEX_CMP;
-         break;
-
-      default:
-         break;
-   }
-
-   GCM_FUNC( cellGcmSetVertexDataArray, index, frequency, stride, size, gcmType, CELL_GCM_LOCATION_LOCAL, offset );
-}
-
 // Look up the memory location of a buffer object (VBO, PBO)
 static inline GLuint rglGcmGetBufferObjectOrigin (GLuint buffer)
 {
diff --git a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp
index b7023f1f5c..ceb3228f6e 100644
--- a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp
+++ b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp
@@ -2000,7 +2000,7 @@ beginning:
          rglAttribute* attrib = as->attrib + i;
          if ( RGLBIT_GET( as->EnabledMask, i ) )
          {
-            const GLsizei stride = attrib->clientStride;
+            GLsizei stride = attrib->clientStride;
             const GLuint freq = attrib->frequency;
 
             if ( RGL_UNLIKELY( dparams->attribXferSize[i] ) )
@@ -2027,9 +2027,61 @@ beginning:
                   + (( const GLubyte* )attrib->clientData - ( const GLubyte* )NULL );
             }
 
-            rglGcmFifoGlVertexAttribPointer( i, attrib->clientSize,
-                  ( rglGcmEnum )attrib->clientType, attrib->normalized,
-                  stride, freq, gpuOffset );
+            rglGcmEnum       type = (rglGcmEnum)attrib->clientType;
+            GLint           size = attrib->clientSize;
+
+            // syntax check
+            switch ( size )
+            {
+               case 0: // disable
+                  stride = 0;
+                  attrib->normalized = 0;
+                  type = RGLGCM_FLOAT;
+                  gpuOffset = 0;
+                  break;
+               case 1:
+               case 2:
+               case 3:
+               case 4:
+                  // valid
+                  break;
+               default:
+                  break;
+            }
+
+            // mapping to native types
+            uint8_t gcmType = 0;
+            switch ( type )
+            {
+               case RGLGCM_UNSIGNED_BYTE:
+                  if (attrib->normalized)
+                     gcmType = CELL_GCM_VERTEX_UB;
+                  else
+                     gcmType = CELL_GCM_VERTEX_UB256;
+                  break;
+
+               case RGLGCM_SHORT:
+                  gcmType = attrib->normalized ? CELL_GCM_VERTEX_S1 : CELL_GCM_VERTEX_S32K;
+                  break;
+
+               case RGLGCM_FLOAT:
+                  gcmType = CELL_GCM_VERTEX_F;
+                  break;
+
+               case RGLGCM_HALF_FLOAT:
+                  gcmType = CELL_GCM_VERTEX_SF;
+                  break;
+
+               case RGLGCM_CMP:
+                  size = 1;   // required for this format
+                  gcmType = CELL_GCM_VERTEX_CMP;
+                  break;
+
+               default:
+                  break;
+            }
+
+            GCM_FUNC( cellGcmSetVertexDataArray, i, freq, stride, size, gcmType, CELL_GCM_LOCATION_LOCAL, gpuOffset );
          }
          else
          {