[WINED3D 9/13] Resend: Use new GenerateShader function for vertex shaders

Jason Green jave27 at gmail.com
Tue May 9 21:38:33 CDT 2006


-------------- next part --------------
Subject: [PATCH 09/13] wined3d: Use new GenerateShader function

---

 dlls/wined3d/vertexshader.c |  168 -------------------------------------------
 1 files changed, 1 insertions(+), 167 deletions(-)

82a60f38a63c8d9b84a054aeb5ccf85676035e9a
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index 2e3d4a8..583b186 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -1195,172 +1195,6 @@ inline static VOID IWineD3DVertexShaderI
 #endif
 }
 
-/**
- * Function parser ...
- */
-
-inline static VOID IWineD3DVertexShaderImpl_GenerateProgramArbHW(IWineD3DVertexShader *iface, CONST DWORD* pFunction) {
-    IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface;
-    const DWORD* pToken = pFunction;
-    const SHADER_OPCODE* curOpcode = NULL;
-    DWORD i;
-    SHADER_BUFFER buffer;
-    DWORD addressUsed, tempsUsed;
-
-#if 0 /* FIXME: Use the buffer that is held by the device, this is ok since fixups will be skipped for software shaders
-        it also requires entering a critical section but cuts down the runtime footprint of wined3d and any memory fragmentation that may occur... */
-    if (This->device->fixupVertexBufferSize < SHADER_PGMSIZE) {
-        HeapFree(GetProcessHeap(), 0, This->fixupVertexBuffer);
-        This->fixupVertexBuffer = HeapAlloc(GetProcessHeap() , 0, SHADER_PGMSIZE);
-        This->fixupVertexBufferSize = PGMSIZE;
-        This->fixupVertexBuffer[0] = 0;
-    }
-    buffer.buffer = This->device->fixupVertexBuffer;
-#endif
-    buffer.buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, SHADER_PGMSIZE); 
-    buffer.bsize = 0;
-    buffer.lineNo = 0;
-
-    /* First pass: figure out which temporary and texture registers are used */
-    shader_get_registers_used((IWineD3DBaseShader*) This, pToken);
-    addressUsed = This->baseShader.textures_used;
-    tempsUsed = This->baseShader.temps_used;
-
-    TRACE("Address registers used: %#lx, Temp registers used %#lx\n", addressUsed, tempsUsed);
-
-    /* TODO: check register usage against GL/Directx limits, and fail if they're exceeded
-        nUseAddressRegister < = GL_MAX_PROGRAM_ADDRESS_REGISTERS_AR
-        nUseTempRegister    <=  GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
-    */
-
-    /* Mesa supports only 95 constants */
-    if (GL_VEND(MESA) || GL_VEND(WINE))
-        This->baseShader.limits.constant_float = 
-           min(95, This->baseShader.limits.constant_float);
-
-    /* FIXME: if jumps are used, use GLSL, else use ARB_vertex_program */
-    shader_addline(&buffer, "!!ARBvp1.0\n");
-
-    /* Pre-declare registers */
-    for (i = 0; i < This->baseShader.limits.temporary; i++) {
-        if (tempsUsed & (1 << i))
-            shader_addline(&buffer, "TEMP R%lu;\n", i);
-    }
-
-    for (i = 0; i < This->baseShader.limits.address; i++) {
-        if (addressUsed & (1 << i))
-            shader_addline(&buffer, "ADDRESS A%ld;\n", i);
-    }
-
-    /* Why do we need to alias those? */
-    shader_addline(&buffer, "PARAM C[%d] = { program.env[0..%d] };\n",
-        This->baseShader.limits.constant_float, 
-        This->baseShader.limits.constant_float - 1);            
-
-  /** second pass, now generate */
-  pToken = pFunction;
-
-  if (NULL != pToken) {
-    while (1) {
-
-      if (D3DVS_END() == *pToken)
-            break;
-
-      /* Skip version */
-      if (vshader_is_version_token(*pToken)) {
-            ++pToken;
-            continue;
-      }
-
-      /* Skip comments */
-      if (vshader_is_comment_token(*pToken)) {
-            DWORD comment_len = (*pToken & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT;
-            ++pToken;
-            TRACE("#%s\n", (char*)pToken);
-            pToken += comment_len;
-            continue;
-      }
-
-      /* Read opcode */
-      curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
-      ++pToken;
-
-      /* Unknown opcode and its parameters */
-      if (NULL == curOpcode) {
-        while (*pToken & 0x80000000) {
-            FIXME("unrecognized opcode: %08lx\n", *pToken);
-            ++pToken;
-        }
-
-      /* Unhandled opcode */
-      } else if (GLNAME_REQUIRE_GLSL == curOpcode->glname) {
-          
-            FIXME("Token %s requires greater functionality than "
-                 "Vertex_Program_ARB supports\n", curOpcode->name);
-            pToken += curOpcode->num_params;
-
-      /* If a generator function is set, use it */
-      } else if (curOpcode->hw_fct != NULL) {
-
-          SHADER_OPCODE_ARG hw_arg;
-
-          hw_arg.shader = (IWineD3DBaseShader*) This;
-          hw_arg.opcode = curOpcode;
-          hw_arg.buffer = &buffer;
-          if (curOpcode->num_params > 0) {
-              hw_arg.dst = *pToken;
-
-              /* FIXME: this does not account for relative address tokens */
-              for (i = 1; i < curOpcode->num_params; i++)
-                 hw_arg.src[i-1] = *(pToken + i);
-          }
-
-          curOpcode->hw_fct(&hw_arg);
-          pToken += curOpcode->num_params;
-
-      /* Unrecognized or No-Op code */
-      } else {
-
-        switch (curOpcode->opcode) {
-        case D3DSIO_NOP:
-            break;
-        default:
-            FIXME("Can't handle opcode %s in hwShader\n", curOpcode->name);
-            pToken += curOpcode->num_params;
-        }
-      }
-    }
-    shader_addline(&buffer, "END\n"); 
-  }
-
-  /* finally null terminate the buffer */
-  buffer.buffer[buffer.bsize] = 0;
-
-  /* Check that Vertex Shaders are supported */
-  if (GL_SUPPORT(ARB_VERTEX_PROGRAM)) {
-      /*  Create the hw shader */
-      /* TODO: change to resource.glObjectHandel or something like that */
-      GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId));
-      TRACE("Creating a hw vertex shader, prg=%d\n", This->baseShader.prgId);
-      GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, This->baseShader.prgId));
-
-      /* Create the program and check for errors */
-      GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 
-          buffer.bsize, buffer.buffer));
-
-      if (glGetError() == GL_INVALID_OPERATION) {
-          GLint errPos;
-          glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
-          FIXME("HW VertexShader Error at position %d: %s\n",
-                errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
-          This->baseShader.prgId = -1;
-      }
-  }
-#if 1 /* if were using the data buffer of device then we don't need to free it */
-  HeapFree(GetProcessHeap(), 0, buffer.buffer);
-#endif
-}
-
 BOOL IWineD3DVertexShaderImpl_ExecuteHAL(IWineD3DVertexShader* iface, WINEVSHADERINPUTDATA* input, WINEVSHADEROUTPUTDATA* output) {
   /**
    * TODO: use the NV_vertex_program (or 1_1) extension
@@ -1864,7 +1698,7 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_
     /* Generate HW shader in needed */
     if (NULL != pFunction  && wined3d_settings.vs_mode == VS_HW) {
 #if 1
-        IWineD3DVertexShaderImpl_GenerateProgramArbHW(iface, pFunction);
+        IWineD3DVertexShaderImpl_GenerateShader(iface, pFunction);
 #endif
     }
 
-- 
1.1.3


More information about the wine-patches mailing list