Commit d7c7c768 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Use separate structures for ddraw style strided data and wined3d's internal stream info.

parent 5390628e
...@@ -3827,12 +3827,12 @@ IDirect3DDeviceImpl_7_DrawPrimitiveStrided(IDirect3DDevice7 *iface, ...@@ -3827,12 +3827,12 @@ IDirect3DDeviceImpl_7_DrawPrimitiveStrided(IDirect3DDevice7 *iface,
*/ */
if(VertexType & D3DFVF_POSITION_MASK) if(VertexType & D3DFVF_POSITION_MASK)
{ {
WineD3DStrided.u.s.position.lpData = D3DDrawPrimStrideData->position.lpvData; WineD3DStrided.position.lpData = D3DDrawPrimStrideData->position.lpvData;
WineD3DStrided.u.s.position.dwStride = D3DDrawPrimStrideData->position.dwStride; WineD3DStrided.position.dwStride = D3DDrawPrimStrideData->position.dwStride;
WineD3DStrided.u.s.position.dwType = WINED3DDECLTYPE_FLOAT3; WineD3DStrided.position.dwType = WINED3DDECLTYPE_FLOAT3;
if (VertexType & D3DFVF_XYZRHW) if (VertexType & D3DFVF_XYZRHW)
{ {
WineD3DStrided.u.s.position.dwType = WINED3DDECLTYPE_FLOAT4; WineD3DStrided.position.dwType = WINED3DDECLTYPE_FLOAT4;
WineD3DStrided.position_transformed = TRUE; WineD3DStrided.position_transformed = TRUE;
} else } else
WineD3DStrided.position_transformed = FALSE; WineD3DStrided.position_transformed = FALSE;
...@@ -3840,35 +3840,35 @@ IDirect3DDeviceImpl_7_DrawPrimitiveStrided(IDirect3DDevice7 *iface, ...@@ -3840,35 +3840,35 @@ IDirect3DDeviceImpl_7_DrawPrimitiveStrided(IDirect3DDevice7 *iface,
if(VertexType & D3DFVF_NORMAL) if(VertexType & D3DFVF_NORMAL)
{ {
WineD3DStrided.u.s.normal.lpData = D3DDrawPrimStrideData->normal.lpvData; WineD3DStrided.normal.lpData = D3DDrawPrimStrideData->normal.lpvData;
WineD3DStrided.u.s.normal.dwStride = D3DDrawPrimStrideData->normal.dwStride; WineD3DStrided.normal.dwStride = D3DDrawPrimStrideData->normal.dwStride;
WineD3DStrided.u.s.normal.dwType = WINED3DDECLTYPE_FLOAT3; WineD3DStrided.normal.dwType = WINED3DDECLTYPE_FLOAT3;
} }
if(VertexType & D3DFVF_DIFFUSE) if(VertexType & D3DFVF_DIFFUSE)
{ {
WineD3DStrided.u.s.diffuse.lpData = D3DDrawPrimStrideData->diffuse.lpvData; WineD3DStrided.diffuse.lpData = D3DDrawPrimStrideData->diffuse.lpvData;
WineD3DStrided.u.s.diffuse.dwStride = D3DDrawPrimStrideData->diffuse.dwStride; WineD3DStrided.diffuse.dwStride = D3DDrawPrimStrideData->diffuse.dwStride;
WineD3DStrided.u.s.diffuse.dwType = WINED3DDECLTYPE_D3DCOLOR; WineD3DStrided.diffuse.dwType = WINED3DDECLTYPE_D3DCOLOR;
} }
if(VertexType & D3DFVF_SPECULAR) if(VertexType & D3DFVF_SPECULAR)
{ {
WineD3DStrided.u.s.specular.lpData = D3DDrawPrimStrideData->specular.lpvData; WineD3DStrided.specular.lpData = D3DDrawPrimStrideData->specular.lpvData;
WineD3DStrided.u.s.specular.dwStride = D3DDrawPrimStrideData->specular.dwStride; WineD3DStrided.specular.dwStride = D3DDrawPrimStrideData->specular.dwStride;
WineD3DStrided.u.s.specular.dwType = WINED3DDECLTYPE_D3DCOLOR; WineD3DStrided.specular.dwType = WINED3DDECLTYPE_D3DCOLOR;
} }
for( i = 0; i < GET_TEXCOUNT_FROM_FVF(VertexType); i++) for( i = 0; i < GET_TEXCOUNT_FROM_FVF(VertexType); i++)
{ {
WineD3DStrided.u.s.texCoords[i].lpData = D3DDrawPrimStrideData->textureCoords[i].lpvData; WineD3DStrided.texCoords[i].lpData = D3DDrawPrimStrideData->textureCoords[i].lpvData;
WineD3DStrided.u.s.texCoords[i].dwStride = D3DDrawPrimStrideData->textureCoords[i].dwStride; WineD3DStrided.texCoords[i].dwStride = D3DDrawPrimStrideData->textureCoords[i].dwStride;
switch(GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i)) switch(GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i))
{ {
case 1: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT1; break; case 1: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT1; break;
case 2: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT2; break; case 2: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT2; break;
case 3: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT3; break; case 3: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT3; break;
case 4: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT4; break; case 4: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT4; break;
default: ERR("Unexpected texture coordinate size %d\n", default: ERR("Unexpected texture coordinate size %d\n",
GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i)); GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i));
} }
...@@ -3968,12 +3968,12 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveStrided(IDirect3DDevice7 *iface, ...@@ -3968,12 +3968,12 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveStrided(IDirect3DDevice7 *iface,
*/ */
if(VertexType & D3DFVF_POSITION_MASK) if(VertexType & D3DFVF_POSITION_MASK)
{ {
WineD3DStrided.u.s.position.lpData = D3DDrawPrimStrideData->position.lpvData; WineD3DStrided.position.lpData = D3DDrawPrimStrideData->position.lpvData;
WineD3DStrided.u.s.position.dwStride = D3DDrawPrimStrideData->position.dwStride; WineD3DStrided.position.dwStride = D3DDrawPrimStrideData->position.dwStride;
WineD3DStrided.u.s.position.dwType = WINED3DDECLTYPE_FLOAT3; WineD3DStrided.position.dwType = WINED3DDECLTYPE_FLOAT3;
if (VertexType & D3DFVF_XYZRHW) if (VertexType & D3DFVF_XYZRHW)
{ {
WineD3DStrided.u.s.position.dwType = WINED3DDECLTYPE_FLOAT4; WineD3DStrided.position.dwType = WINED3DDECLTYPE_FLOAT4;
WineD3DStrided.position_transformed = TRUE; WineD3DStrided.position_transformed = TRUE;
} else } else
WineD3DStrided.position_transformed = FALSE; WineD3DStrided.position_transformed = FALSE;
...@@ -3981,35 +3981,35 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveStrided(IDirect3DDevice7 *iface, ...@@ -3981,35 +3981,35 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveStrided(IDirect3DDevice7 *iface,
if(VertexType & D3DFVF_NORMAL) if(VertexType & D3DFVF_NORMAL)
{ {
WineD3DStrided.u.s.normal.lpData = D3DDrawPrimStrideData->normal.lpvData; WineD3DStrided.normal.lpData = D3DDrawPrimStrideData->normal.lpvData;
WineD3DStrided.u.s.normal.dwStride = D3DDrawPrimStrideData->normal.dwStride; WineD3DStrided.normal.dwStride = D3DDrawPrimStrideData->normal.dwStride;
WineD3DStrided.u.s.normal.dwType = WINED3DDECLTYPE_FLOAT3; WineD3DStrided.normal.dwType = WINED3DDECLTYPE_FLOAT3;
} }
if(VertexType & D3DFVF_DIFFUSE) if(VertexType & D3DFVF_DIFFUSE)
{ {
WineD3DStrided.u.s.diffuse.lpData = D3DDrawPrimStrideData->diffuse.lpvData; WineD3DStrided.diffuse.lpData = D3DDrawPrimStrideData->diffuse.lpvData;
WineD3DStrided.u.s.diffuse.dwStride = D3DDrawPrimStrideData->diffuse.dwStride; WineD3DStrided.diffuse.dwStride = D3DDrawPrimStrideData->diffuse.dwStride;
WineD3DStrided.u.s.diffuse.dwType = WINED3DDECLTYPE_D3DCOLOR; WineD3DStrided.diffuse.dwType = WINED3DDECLTYPE_D3DCOLOR;
} }
if(VertexType & D3DFVF_SPECULAR) if(VertexType & D3DFVF_SPECULAR)
{ {
WineD3DStrided.u.s.specular.lpData = D3DDrawPrimStrideData->specular.lpvData; WineD3DStrided.specular.lpData = D3DDrawPrimStrideData->specular.lpvData;
WineD3DStrided.u.s.specular.dwStride = D3DDrawPrimStrideData->specular.dwStride; WineD3DStrided.specular.dwStride = D3DDrawPrimStrideData->specular.dwStride;
WineD3DStrided.u.s.specular.dwType = WINED3DDECLTYPE_D3DCOLOR; WineD3DStrided.specular.dwType = WINED3DDECLTYPE_D3DCOLOR;
} }
for( i = 0; i < GET_TEXCOUNT_FROM_FVF(VertexType); i++) for( i = 0; i < GET_TEXCOUNT_FROM_FVF(VertexType); i++)
{ {
WineD3DStrided.u.s.texCoords[i].lpData = D3DDrawPrimStrideData->textureCoords[i].lpvData; WineD3DStrided.texCoords[i].lpData = D3DDrawPrimStrideData->textureCoords[i].lpvData;
WineD3DStrided.u.s.texCoords[i].dwStride = D3DDrawPrimStrideData->textureCoords[i].dwStride; WineD3DStrided.texCoords[i].dwStride = D3DDrawPrimStrideData->textureCoords[i].dwStride;
switch(GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i)) switch(GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i))
{ {
case 1: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT1; break; case 1: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT1; break;
case 2: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT2; break; case 2: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT2; break;
case 3: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT3; break; case 3: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT3; break;
case 4: WineD3DStrided.u.s.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT4; break; case 4: WineD3DStrided.texCoords[i].dwType = WINED3DDECLTYPE_FLOAT4; break;
default: ERR("Unexpected texture coordinate size %d\n", default: ERR("Unexpected texture coordinate size %d\n",
GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i)); GET_TEXCOORD_SIZE_FROM_FVF(VertexType, i));
} }
......
...@@ -129,12 +129,12 @@ fail: ...@@ -129,12 +129,12 @@ fail:
static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This, static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
const enum wined3d_buffer_conversion_type conversion_type, const enum wined3d_buffer_conversion_type conversion_type,
const WineDirect3DStridedData *attrib, DWORD *stride_this_run, const DWORD type) const struct wined3d_stream_info_element *attrib, DWORD *stride_this_run, const DWORD type)
{ {
DWORD attrib_size; DWORD attrib_size;
BOOL ret = FALSE; BOOL ret = FALSE;
unsigned int i; unsigned int i;
DWORD offset = This->resource.wineD3DDevice->stateBlock->streamOffset[attrib->streamNo]; DWORD offset = This->resource.wineD3DDevice->stateBlock->streamOffset[attrib->stream_idx];
DWORD_PTR data; DWORD_PTR data;
/* Check for some valid situations which cause us pain. One is if the buffer is used for /* Check for some valid situations which cause us pain. One is if the buffer is used for
...@@ -142,18 +142,18 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This, ...@@ -142,18 +142,18 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
* with different strides. In the 2nd case we might have to drop conversion entirely, * with different strides. In the 2nd case we might have to drop conversion entirely,
* it is possible that the same bytes are once read as FLOAT2 and once as UBYTE4N. * it is possible that the same bytes are once read as FLOAT2 and once as UBYTE4N.
*/ */
if (attrib->dwStride == 0) if (!attrib->stride)
{ {
FIXME("%s used with stride 0, let's hope we get the vertex stride from somewhere else\n", FIXME("%s used with stride 0, let's hope we get the vertex stride from somewhere else\n",
debug_d3ddecltype(type)); debug_d3ddecltype(type));
} }
else if(attrib->dwStride != *stride_this_run && *stride_this_run) else if(attrib->stride != *stride_this_run && *stride_this_run)
{ {
FIXME("Got two concurrent strides, %d and %d\n", attrib->dwStride, *stride_this_run); FIXME("Got two concurrent strides, %d and %d\n", attrib->stride, *stride_this_run);
} }
else else
{ {
*stride_this_run = attrib->dwStride; *stride_this_run = attrib->stride;
if (This->stride != *stride_this_run) if (This->stride != *stride_this_run)
{ {
/* We rely that this happens only on the first converted attribute that is found, /* We rely that this happens only on the first converted attribute that is found,
...@@ -168,7 +168,7 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This, ...@@ -168,7 +168,7 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
} }
} }
data = (((DWORD_PTR) attrib->lpData) + offset) % This->stride; data = (((DWORD_PTR)attrib->data) + offset) % This->stride;
attrib_size = WINED3D_ATR_SIZE(type) * WINED3D_ATR_TYPESIZE(type); attrib_size = WINED3D_ATR_SIZE(type) * WINED3D_ATR_TYPESIZE(type);
for (i = 0; i < attrib_size; ++i) for (i = 0; i < attrib_size; ++i)
{ {
...@@ -185,18 +185,18 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This, ...@@ -185,18 +185,18 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
} }
static BOOL buffer_check_attribute(struct wined3d_buffer *This, static BOOL buffer_check_attribute(struct wined3d_buffer *This,
const WineDirect3DStridedData *attrib, const BOOL check_d3dcolor, const BOOL is_ffp_position, const struct wined3d_stream_info_element *attrib, const BOOL check_d3dcolor, const BOOL is_ffp_position,
const BOOL is_ffp_color, DWORD *stride_this_run, BOOL *float16_used) const BOOL is_ffp_color, DWORD *stride_this_run, BOOL *float16_used)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
DWORD type; WINED3DDECLTYPE type;
/* Ignore attributes that do not have our vbo. After that check we can be sure that the attribute is /* Ignore attributes that do not have our vbo. After that check we can be sure that the attribute is
* there, on nonexistent attribs the vbo is 0. * there, on nonexistent attribs the vbo is 0.
*/ */
if (attrib->VBO != This->buffer_object) return FALSE; if (attrib->buffer_object != This->buffer_object) return FALSE;
type = attrib->dwType; type = attrib->d3d_type;
/* Look for newly appeared conversion */ /* Look for newly appeared conversion */
if (!GL_SUPPORT(NV_HALF_FLOAT) && (type == WINED3DDECLTYPE_FLOAT16_2 || type == WINED3DDECLTYPE_FLOAT16_4)) if (!GL_SUPPORT(NV_HALF_FLOAT) && (type == WINED3DDECLTYPE_FLOAT16_2 || type == WINED3DDECLTYPE_FLOAT16_4))
{ {
...@@ -228,7 +228,7 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This, ...@@ -228,7 +228,7 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This,
} }
static UINT *find_conversion_shift(struct wined3d_buffer *This, static UINT *find_conversion_shift(struct wined3d_buffer *This,
const WineDirect3DVertexStridedData *strided, UINT stride) const struct wined3d_stream_info *strided, UINT stride)
{ {
UINT *ret, i, j, shift, orig_type_size; UINT *ret, i, j, shift, orig_type_size;
DWORD type; DWORD type;
...@@ -243,9 +243,9 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This, ...@@ -243,9 +243,9 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This,
ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWORD) * stride); ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWORD) * stride);
for (i = 0; i < MAX_ATTRIBS; ++i) for (i = 0; i < MAX_ATTRIBS; ++i)
{ {
if (strided->u.input[i].VBO != This->buffer_object) continue; if (strided->elements[i].buffer_object != This->buffer_object) continue;
type = strided->u.input[i].dwType; type = strided->elements[i].d3d_type;
if (type == WINED3DDECLTYPE_FLOAT16_2) if (type == WINED3DDECLTYPE_FLOAT16_2)
{ {
shift = 4; shift = 4;
...@@ -258,7 +258,7 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This, ...@@ -258,7 +258,7 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This,
*/ */
for (j = 4; j < 8; ++j) for (j = 4; j < 8; ++j)
{ {
ret[(DWORD_PTR)strided->u.input[i].lpData + j] += 4; ret[(DWORD_PTR)strided->elements[i].data + j] += 4;
} }
} }
else else
...@@ -270,7 +270,7 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This, ...@@ -270,7 +270,7 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This,
if (shift) if (shift)
{ {
orig_type_size = WINED3D_ATR_TYPESIZE(type) * WINED3D_ATR_SIZE(type); orig_type_size = WINED3D_ATR_TYPESIZE(type) * WINED3D_ATR_SIZE(type);
for (j = (DWORD_PTR)strided->u.input[i].lpData + orig_type_size; j < stride; ++j) for (j = (DWORD_PTR)strided->elements[i].data + orig_type_size; j < stride; ++j)
{ {
ret[j] += shift; ret[j] += shift;
} }
...@@ -371,7 +371,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This) ...@@ -371,7 +371,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
} }
for (i = 0; i < MAX_ATTRIBS; ++i) for (i = 0; i < MAX_ATTRIBS; ++i)
{ {
ret = buffer_check_attribute(This, &device->strided_streams.u.input[i], ret = buffer_check_attribute(This, &device->strided_streams.elements[i],
FALSE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; FALSE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
} }
...@@ -391,29 +391,29 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This) ...@@ -391,29 +391,29 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
* the attributes that our current fixed function pipeline implementation cares for. * the attributes that our current fixed function pipeline implementation cares for.
*/ */
BOOL support_d3dcolor = GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA); BOOL support_d3dcolor = GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA);
ret = buffer_check_attribute(This, &device->strided_streams.u.s.position, ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_POSITION],
TRUE, TRUE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, TRUE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.normal, ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_NORMAL],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.diffuse, ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_DIFFUSE],
!support_d3dcolor, FALSE, TRUE, &stride_this_run, &float16_used) || ret; !support_d3dcolor, FALSE, TRUE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.specular, ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_SPECULAR],
!support_d3dcolor, FALSE, TRUE, &stride_this_run, &float16_used) || ret; !support_d3dcolor, FALSE, TRUE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[0], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD0],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[1], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD1],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[2], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD2],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[3], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD3],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[4], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD4],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[5], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD5],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[6], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD6],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, &device->strided_streams.u.s.texCoords[7], ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD7],
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret; TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
if (float16_used) FIXME("Float16 conversion used with fixed function vertex processing\n"); if (float16_used) FIXME("Float16 conversion used with fixed function vertex processing\n");
......
...@@ -591,8 +591,9 @@ do { \ ...@@ -591,8 +591,9 @@ do { \
/* Trace vector and strided data information */ /* Trace vector and strided data information */
#define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w); #define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w);
#define TRACE_STRIDED(sd,name) TRACE( #name "=(data:%p, stride:%d, type:%d, vbo %d, stream %u)\n", \ #define TRACE_STRIDED(si, name) TRACE( #name "=(data:%p, stride:%d, type:%d, vbo %d, stream %u)\n", \
sd->u.s.name.lpData, sd->u.s.name.dwStride, sd->u.s.name.dwType, sd->u.s.name.VBO, sd->u.s.name.streamNo); si->elements[name].data, si->elements[name].stride, si->elements[name].d3d_type, \
si->elements[name].buffer_object, si->elements[name].stream_idx);
/* Defines used for optimizations */ /* Defines used for optimizations */
...@@ -650,6 +651,47 @@ extern BOOL isDumpingFrames; ...@@ -650,6 +651,47 @@ extern BOOL isDumpingFrames;
extern LONG primCounter; extern LONG primCounter;
#endif #endif
enum wined3d_ffp_idx
{
WINED3D_FFP_POSITION = 0,
WINED3D_FFP_BLENDWEIGHT = 1,
WINED3D_FFP_BLENDINDICES = 2,
WINED3D_FFP_NORMAL = 3,
WINED3D_FFP_PSIZE = 4,
WINED3D_FFP_DIFFUSE = 5,
WINED3D_FFP_SPECULAR = 6,
WINED3D_FFP_TEXCOORD0 = 7,
WINED3D_FFP_TEXCOORD1 = 8,
WINED3D_FFP_TEXCOORD2 = 9,
WINED3D_FFP_TEXCOORD3 = 10,
WINED3D_FFP_TEXCOORD4 = 11,
WINED3D_FFP_TEXCOORD5 = 12,
WINED3D_FFP_TEXCOORD6 = 13,
WINED3D_FFP_TEXCOORD7 = 14,
};
struct wined3d_stream_info_element
{
WINED3DDECLTYPE d3d_type;
GLint size;
GLint format;
GLenum type;
GLsizei stride;
GLboolean normalized;
const BYTE *data;
int type_size;
UINT stream_idx;
GLuint buffer_object;
};
struct wined3d_stream_info
{
struct wined3d_stream_info_element elements[MAX_ATTRIBS];
BOOL position_transformed;
WORD swizzle_map; /* MAX_ATTRIBS, 16 */
WORD use_map; /* MAX_ATTRIBS, 16 */
};
/***************************************************************************** /*****************************************************************************
* Prototypes * Prototypes
*/ */
...@@ -657,13 +699,6 @@ extern LONG primCounter; ...@@ -657,13 +699,6 @@ extern LONG primCounter;
/* Routine common to the draw primitive and draw indexed primitive routines */ /* Routine common to the draw primitive and draw indexed primitive routines */
void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertices, void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertices,
UINT start_idx, UINT idxBytes, const void *idxData, UINT minIndex); UINT start_idx, UINT idxBytes, const void *idxData, UINT minIndex);
void primitiveDeclarationConvertToStridedData(
IWineD3DDevice *iface,
BOOL useVertexShaderFunction,
WineDirect3DVertexStridedData *strided,
BOOL *fixup);
DWORD get_flexible_vertex_size(DWORD d3dvtVertexType); DWORD get_flexible_vertex_size(DWORD d3dvtVertexType);
typedef void (WINE_GLAPI *glAttribFunc)(const void *data); typedef void (WINE_GLAPI *glAttribFunc)(const void *data);
...@@ -1174,7 +1209,7 @@ struct IWineD3DDeviceImpl ...@@ -1174,7 +1209,7 @@ struct IWineD3DDeviceImpl
DWORD rev_tex_unit_map[MAX_COMBINED_SAMPLERS]; DWORD rev_tex_unit_map[MAX_COMBINED_SAMPLERS];
/* Stream source management */ /* Stream source management */
WineDirect3DVertexStridedData strided_streams; struct wined3d_stream_info strided_streams;
const WineDirect3DVertexStridedData *up_strided; const WineDirect3DVertexStridedData *up_strided;
/* Context management */ /* Context management */
...@@ -1194,6 +1229,10 @@ struct IWineD3DDeviceImpl ...@@ -1194,6 +1229,10 @@ struct IWineD3DDeviceImpl
extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl; extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;
void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup);
void device_stream_info_from_strided(IWineD3DDeviceImpl *This,
const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info);
HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count, HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
CONST WINED3DRECT* pRects, DWORD Flags, WINED3DCOLOR Color, CONST WINED3DRECT* pRects, DWORD Flags, WINED3DCOLOR Color,
float Z, DWORD Stencil); float Z, DWORD Stencil);
......
...@@ -1918,41 +1918,16 @@ typedef struct WineDirect3DStridedData ...@@ -1918,41 +1918,16 @@ typedef struct WineDirect3DStridedData
const BYTE *lpData; /* Pointer to start of data */ const BYTE *lpData; /* Pointer to start of data */
DWORD dwStride; /* Stride between occurrences of this data */ DWORD dwStride; /* Stride between occurrences of this data */
DWORD dwType; /* Type (as in D3DVSDT_TYPE) */ DWORD dwType; /* Type (as in D3DVSDT_TYPE) */
unsigned int VBO; /* Vertex buffer object this data is in */
UINT streamNo; /* D3D stream number */
} WineDirect3DStridedData; } WineDirect3DStridedData;
typedef struct WineDirect3DVertexStridedData typedef struct WineDirect3DVertexStridedData
{ {
/* WineDirect3DStridedData position;
* IMPORTANT: WineDirect3DStridedData normal;
* This structure can be accessed in two ways: Named access, and array WineDirect3DStridedData diffuse;
* access. Please note that named access is only valid with the fixed WineDirect3DStridedData specular;
* function vertex pipeline, and the arrays are only valid with the WineDirect3DStridedData texCoords[WINED3DDP_MAXTEXCOORD];
* programmable vertex pipeline(vertex shaders).
*/
union
{
struct
{
/* Do not add or reorder fields here,
* so this can be indexed as an array */
WineDirect3DStridedData position;
WineDirect3DStridedData blendWeights;
WineDirect3DStridedData blendMatrixIndices;
WineDirect3DStridedData normal;
WineDirect3DStridedData pSize;
WineDirect3DStridedData diffuse;
WineDirect3DStridedData specular;
WineDirect3DStridedData texCoords[WINED3DDP_MAXTEXCOORD];
/* Add fields here */
} s;
WineDirect3DStridedData input[16]; /* Indexed by constants in D3DVSDE_REGISTER */
} u;
BOOL position_transformed; BOOL position_transformed;
WORD swizzle_map; /* MAX_ATTRIBS, 16 */
WORD use_map; /* MAX_ATTRIBS, 16 */
} WineDirect3DVertexStridedData; } WineDirect3DVertexStridedData;
typedef struct _WINED3DVSHADERCAPS2_0 typedef struct _WINED3DVSHADERCAPS2_0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment