st/nine: Squash indexbuffer9 and vertexbuffer9
The indexbuffer9 codebase was lagging behind the one of vertexbuffer9. Add buffer9 as common code base for indexbuffer9 and vertexbuffer9. Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
committed by
Axel Davy
parent
b6bb8d561a
commit
ea3f504f7c
@@ -5,6 +5,8 @@ C_SOURCES := \
|
||||
authenticatedchannel9.h \
|
||||
basetexture9.c \
|
||||
basetexture9.h \
|
||||
buffer9.c \
|
||||
buffer9.h \
|
||||
cryptosession9.c \
|
||||
cryptosession9.h \
|
||||
cubetexture9.c \
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
/*
|
||||
* Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
|
||||
* Copyright 2015 Patrick Rudolph <siro@das-labor.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
||||
* the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
#include "buffer9.h"
|
||||
#include "device9.h"
|
||||
#include "nine_helpers.h"
|
||||
#include "nine_pipe.h"
|
||||
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_format.h"
|
||||
#include "util/u_box.h"
|
||||
|
||||
#define DBG_CHANNEL (DBG_INDEXBUFFER|DBG_VERTEXBUFFER)
|
||||
|
||||
HRESULT
|
||||
NineBuffer9_ctor( struct NineBuffer9 *This,
|
||||
struct NineUnknownParams *pParams,
|
||||
D3DRESOURCETYPE Type,
|
||||
DWORD Usage,
|
||||
UINT Size,
|
||||
D3DPOOL Pool )
|
||||
{
|
||||
struct pipe_resource *info = &This->base.info;
|
||||
HRESULT hr;
|
||||
|
||||
DBG("This=%p Size=0x%x Usage=%x Pool=%u\n", This, Size, Usage, Pool);
|
||||
|
||||
user_assert(Pool != D3DPOOL_SCRATCH, D3DERR_INVALIDCALL);
|
||||
|
||||
This->maps = MALLOC(sizeof(struct pipe_transfer *));
|
||||
if (!This->maps)
|
||||
return E_OUTOFMEMORY;
|
||||
This->nmaps = 0;
|
||||
This->maxmaps = 1;
|
||||
This->size = Size;
|
||||
|
||||
This->pipe = pParams->device->pipe;
|
||||
|
||||
info->screen = pParams->device->screen;
|
||||
info->target = PIPE_BUFFER;
|
||||
info->format = PIPE_FORMAT_R8_UNORM;
|
||||
info->width0 = Size;
|
||||
info->flags = 0;
|
||||
|
||||
info->bind = PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_TRANSFER_WRITE;
|
||||
if (!(Usage & D3DUSAGE_WRITEONLY))
|
||||
info->bind |= PIPE_BIND_TRANSFER_READ;
|
||||
|
||||
info->usage = PIPE_USAGE_DEFAULT;
|
||||
if (Usage & D3DUSAGE_DYNAMIC)
|
||||
info->usage = PIPE_USAGE_STREAM;
|
||||
else if (Pool == D3DPOOL_SYSTEMMEM)
|
||||
info->usage = PIPE_USAGE_STAGING;
|
||||
|
||||
/* if (pDesc->Usage & D3DUSAGE_DONOTCLIP) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_NONSECURE) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_NPATCHES) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_POINTS) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_RTPATCHES) { } */
|
||||
if (Usage & D3DUSAGE_SOFTWAREPROCESSING)
|
||||
DBG("Application asked for Software Vertex Processing, "
|
||||
"but this is unimplemented\n");
|
||||
/* if (pDesc->Usage & D3DUSAGE_TEXTAPI) { } */
|
||||
|
||||
info->height0 = 1;
|
||||
info->depth0 = 1;
|
||||
info->array_size = 1;
|
||||
info->last_level = 0;
|
||||
info->nr_samples = 0;
|
||||
|
||||
hr = NineResource9_ctor(&This->base, pParams, NULL, TRUE,
|
||||
Type, Pool, Usage);
|
||||
return hr;
|
||||
}
|
||||
|
||||
void
|
||||
NineBuffer9_dtor( struct NineBuffer9 *This )
|
||||
{
|
||||
if (This->maps) {
|
||||
while (This->nmaps) {
|
||||
NineBuffer9_Unlock(This);
|
||||
}
|
||||
FREE(This->maps);
|
||||
}
|
||||
|
||||
NineResource9_dtor(&This->base);
|
||||
}
|
||||
|
||||
struct pipe_resource *
|
||||
NineBuffer9_GetResource( struct NineBuffer9 *This )
|
||||
{
|
||||
return NineResource9_GetResource(&This->base);
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
NineBuffer9_Lock( struct NineBuffer9 *This,
|
||||
UINT OffsetToLock,
|
||||
UINT SizeToLock,
|
||||
void **ppbData,
|
||||
DWORD Flags )
|
||||
{
|
||||
struct pipe_box box;
|
||||
void *data;
|
||||
unsigned usage = d3dlock_buffer_to_pipe_transfer_usage(Flags);
|
||||
|
||||
DBG("This=%p(pipe=%p) OffsetToLock=0x%x, SizeToLock=0x%x, Flags=0x%x\n",
|
||||
This, This->base.resource,
|
||||
OffsetToLock, SizeToLock, Flags);
|
||||
|
||||
user_assert(ppbData, E_POINTER);
|
||||
user_assert(!(Flags & ~(D3DLOCK_DISCARD |
|
||||
D3DLOCK_DONOTWAIT |
|
||||
D3DLOCK_NO_DIRTY_UPDATE |
|
||||
D3DLOCK_NOSYSLOCK |
|
||||
D3DLOCK_READONLY |
|
||||
D3DLOCK_NOOVERWRITE)), D3DERR_INVALIDCALL);
|
||||
|
||||
if (This->nmaps == This->maxmaps) {
|
||||
struct pipe_transfer **newmaps =
|
||||
REALLOC(This->maps, sizeof(struct pipe_transfer *)*This->maxmaps,
|
||||
sizeof(struct pipe_transfer *)*(This->maxmaps << 1));
|
||||
if (newmaps == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
This->maxmaps <<= 1;
|
||||
This->maps = newmaps;
|
||||
}
|
||||
|
||||
if (SizeToLock == 0) {
|
||||
SizeToLock = This->size - OffsetToLock;
|
||||
user_warn(OffsetToLock != 0);
|
||||
}
|
||||
|
||||
u_box_1d(OffsetToLock, SizeToLock, &box);
|
||||
|
||||
data = This->pipe->transfer_map(This->pipe, This->base.resource, 0,
|
||||
usage, &box, &This->maps[This->nmaps]);
|
||||
|
||||
if (!data) {
|
||||
DBG("pipe::transfer_map failed\n"
|
||||
" usage = %x\n"
|
||||
" box.x = %u\n"
|
||||
" box.width = %u\n",
|
||||
usage, box.x, box.width);
|
||||
/* not sure what to return, msdn suggests this */
|
||||
if (Flags & D3DLOCK_DONOTWAIT)
|
||||
return D3DERR_WASSTILLDRAWING;
|
||||
return D3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
DBG("returning pointer %p\n", data);
|
||||
This->nmaps++;
|
||||
*ppbData = data;
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
NineBuffer9_Unlock( struct NineBuffer9 *This )
|
||||
{
|
||||
DBG("This=%p\n", This);
|
||||
|
||||
user_assert(This->nmaps > 0, D3DERR_INVALIDCALL);
|
||||
This->pipe->transfer_unmap(This->pipe, This->maps[--(This->nmaps)]);
|
||||
return D3D_OK;
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
|
||||
* Copyright 2015 Patrick Rudolph <siro@das-labor.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
||||
* the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
#ifndef _NINE_BUFFER9_H_
|
||||
#define _NINE_BUFFER9_H_
|
||||
|
||||
#include "resource9.h"
|
||||
|
||||
struct pipe_screen;
|
||||
struct pipe_context;
|
||||
struct pipe_transfer;
|
||||
|
||||
struct NineBuffer9
|
||||
{
|
||||
struct NineResource9 base;
|
||||
|
||||
/* G3D */
|
||||
struct pipe_context *pipe;
|
||||
struct pipe_transfer **maps;
|
||||
int nmaps, maxmaps;
|
||||
UINT size;
|
||||
};
|
||||
static inline struct NineBuffer9 *
|
||||
NineBuffer9( void *data )
|
||||
{
|
||||
return (struct NineBuffer9 *)data;
|
||||
}
|
||||
|
||||
HRESULT
|
||||
NineBuffer9_ctor( struct NineBuffer9 *This,
|
||||
struct NineUnknownParams *pParams,
|
||||
D3DRESOURCETYPE Type,
|
||||
DWORD Usage,
|
||||
UINT Size,
|
||||
D3DPOOL Pool );
|
||||
|
||||
void
|
||||
NineBuffer9_dtor( struct NineBuffer9 *This );
|
||||
|
||||
struct pipe_resource *
|
||||
NineBuffer9_GetResource( struct NineBuffer9 *This );
|
||||
|
||||
HRESULT WINAPI
|
||||
NineBuffer9_Lock( struct NineBuffer9 *This,
|
||||
UINT OffsetToLock,
|
||||
UINT SizeToLock,
|
||||
void **ppbData,
|
||||
DWORD Flags );
|
||||
|
||||
HRESULT WINAPI
|
||||
NineBuffer9_Unlock( struct NineBuffer9 *This );
|
||||
|
||||
#endif /* _NINE_BUFFER9_H_ */
|
||||
@@ -3123,7 +3123,7 @@ NineDevice9_ProcessVertices( struct NineDevice9 *This,
|
||||
buffer_offset = 0;
|
||||
} else {
|
||||
/* SO matches vertex declaration */
|
||||
resource = dst->base.resource;
|
||||
resource = NineVertexBuffer9_GetResource(dst);
|
||||
buffer_offset = DestIndex * vs->so->stride[0];
|
||||
}
|
||||
target = This->pipe->create_stream_output_target(This->pipe, resource,
|
||||
@@ -3512,7 +3512,7 @@ NineDevice9_SetStreamSource( struct NineDevice9 *This,
|
||||
state->vtxbuf[i].buffer_offset = OffsetInBytes;
|
||||
}
|
||||
pipe_resource_reference(&state->vtxbuf[i].buffer,
|
||||
pStreamData ? pVBuf9->base.resource : NULL);
|
||||
pStreamData ? NineVertexBuffer9_GetResource(pVBuf9) : NULL);
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
@@ -40,52 +40,17 @@ NineIndexBuffer9_ctor( struct NineIndexBuffer9 *This,
|
||||
struct NineUnknownParams *pParams,
|
||||
D3DINDEXBUFFER_DESC *pDesc )
|
||||
{
|
||||
struct pipe_resource *info = &This->base.info;
|
||||
HRESULT hr;
|
||||
DBG("This=%p pParams=%p pDesc=%p Usage=%s\n",
|
||||
This, pParams, pDesc, nine_D3DUSAGE_to_str(pDesc->Usage));
|
||||
|
||||
This->pipe = pParams->device->pipe;
|
||||
|
||||
info->screen = pParams->device->screen;
|
||||
info->target = PIPE_BUFFER;
|
||||
info->format = PIPE_FORMAT_R8_UNORM;
|
||||
info->width0 = pDesc->Size;
|
||||
info->flags = 0;
|
||||
|
||||
info->bind = PIPE_BIND_INDEX_BUFFER | PIPE_BIND_TRANSFER_WRITE;
|
||||
if (!(pDesc->Usage & D3DUSAGE_WRITEONLY))
|
||||
info->bind |= PIPE_BIND_TRANSFER_READ;
|
||||
|
||||
info->usage = PIPE_USAGE_DEFAULT;
|
||||
if (pDesc->Usage & D3DUSAGE_DYNAMIC)
|
||||
info->usage = PIPE_USAGE_STREAM;
|
||||
if (pDesc->Pool == D3DPOOL_SYSTEMMEM)
|
||||
info->usage = PIPE_USAGE_STAGING;
|
||||
|
||||
/* if (pDesc->Usage & D3DUSAGE_DONOTCLIP) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_NONSECURE) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_NPATCHES) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_POINTS) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_RTPATCHES) { } */
|
||||
if (pDesc->Usage & D3DUSAGE_SOFTWAREPROCESSING)
|
||||
DBG("Application asked for Software Vertex Processing, "
|
||||
"but this is unimplemented\n");
|
||||
|
||||
info->height0 = 1;
|
||||
info->depth0 = 1;
|
||||
info->array_size = 1;
|
||||
info->last_level = 0;
|
||||
info->nr_samples = 0;
|
||||
|
||||
hr = NineResource9_ctor(&This->base, pParams, NULL, TRUE, D3DRTYPE_INDEXBUFFER,
|
||||
pDesc->Pool, pDesc->Usage);
|
||||
hr = NineBuffer9_ctor(&This->base, pParams, D3DRTYPE_INDEXBUFFER,
|
||||
pDesc->Usage, pDesc->Size, pDesc->Pool);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
This->buffer.buffer = This->base.resource;
|
||||
This->buffer.buffer = NineIndexBuffer9_GetResource(This);
|
||||
This->buffer.offset = 0;
|
||||
This->map_count = 0;
|
||||
|
||||
switch (pDesc->Format) {
|
||||
case D3DFMT_INDEX16: This->buffer.index_size = 2; break;
|
||||
@@ -105,9 +70,7 @@ NineIndexBuffer9_ctor( struct NineIndexBuffer9 *This,
|
||||
void
|
||||
NineIndexBuffer9_dtor( struct NineIndexBuffer9 *This )
|
||||
{
|
||||
if (This->transfer) { NineIndexBuffer9_Unlock(This); }
|
||||
|
||||
NineResource9_dtor(&This->base);
|
||||
NineBuffer9_dtor(&This->base);
|
||||
}
|
||||
|
||||
const struct pipe_index_buffer *
|
||||
@@ -116,6 +79,12 @@ NineIndexBuffer9_GetBuffer( struct NineIndexBuffer9 *This )
|
||||
return &This->buffer;
|
||||
}
|
||||
|
||||
struct pipe_resource *
|
||||
NineIndexBuffer9_GetResource( struct NineIndexBuffer9 *This )
|
||||
{
|
||||
return NineBuffer9_GetResource(&This->base);
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
NineIndexBuffer9_Lock( struct NineIndexBuffer9 *This,
|
||||
UINT OffsetToLock,
|
||||
@@ -123,59 +92,13 @@ NineIndexBuffer9_Lock( struct NineIndexBuffer9 *This,
|
||||
void **ppbData,
|
||||
DWORD Flags )
|
||||
{
|
||||
struct pipe_box box;
|
||||
void *data;
|
||||
UINT count;
|
||||
const unsigned usage = d3dlock_buffer_to_pipe_transfer_usage(Flags);
|
||||
|
||||
DBG("This=%p OffsetToLock=%u SizeToLock=%u ppbData=%p Flags=%i "
|
||||
"transfer=%p map_count=%u\n", This, OffsetToLock,
|
||||
SizeToLock, ppbData, Flags, This->transfer, This->map_count);
|
||||
|
||||
count = ++This->map_count;
|
||||
|
||||
if (SizeToLock == 0) {
|
||||
SizeToLock = This->desc.Size - OffsetToLock;
|
||||
user_warn(OffsetToLock != 0);
|
||||
}
|
||||
|
||||
u_box_1d(OffsetToLock, SizeToLock, &box);
|
||||
|
||||
if (unlikely(count != 1)) {
|
||||
DBG("Lock has been called on already locked buffer."
|
||||
"Unmapping before mapping again.");
|
||||
This->pipe->transfer_unmap(This->pipe, This->transfer);
|
||||
}
|
||||
data = This->pipe->transfer_map(This->pipe, This->base.resource, 0,
|
||||
usage, &box, &This->transfer);
|
||||
if (!This->transfer) {
|
||||
DBG("pipe::transfer_map failed\n"
|
||||
" usage = %u\n"
|
||||
" box.x = %u\n"
|
||||
" box.width = %u\n",
|
||||
usage, box.x, box.width);
|
||||
}
|
||||
*ppbData = data;
|
||||
DBG("Returning memory at %p at address %p\n", *ppbData, ppbData);
|
||||
|
||||
return D3D_OK;
|
||||
return NineBuffer9_Lock(&This->base, OffsetToLock, SizeToLock, ppbData, Flags);
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
NineIndexBuffer9_Unlock( struct NineIndexBuffer9 *This )
|
||||
{
|
||||
DBG("This=%p\n", This);
|
||||
if (!This->map_count) {
|
||||
DBG("Unmap called without a previous map call.\n");
|
||||
return D3D_OK;
|
||||
}
|
||||
if (--This->map_count) {
|
||||
DBG("Ignoring unmap.\n");
|
||||
return D3D_OK;
|
||||
}
|
||||
This->pipe->transfer_unmap(This->pipe, This->transfer);
|
||||
This->transfer = NULL;
|
||||
return D3D_OK;
|
||||
return NineBuffer9_Unlock(&This->base);
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#define _NINE_INDEXBUFFER9_H_
|
||||
|
||||
#include "resource9.h"
|
||||
|
||||
#include "buffer9.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
struct pipe_screen;
|
||||
@@ -35,13 +35,10 @@ struct NineDevice9;
|
||||
|
||||
struct NineIndexBuffer9
|
||||
{
|
||||
struct NineResource9 base;
|
||||
struct NineBuffer9 base;
|
||||
|
||||
/* g3d stuff */
|
||||
struct pipe_context *pipe;
|
||||
struct pipe_index_buffer buffer;
|
||||
struct pipe_transfer *transfer;
|
||||
UINT map_count;
|
||||
|
||||
D3DINDEXBUFFER_DESC desc;
|
||||
};
|
||||
@@ -69,6 +66,8 @@ NineIndexBuffer9_dtor( struct NineIndexBuffer9 *This );
|
||||
const struct pipe_index_buffer *
|
||||
NineIndexBuffer9_GetBuffer( struct NineIndexBuffer9 *This );
|
||||
|
||||
struct pipe_resource *
|
||||
NineIndexBuffer9_GetResource( struct NineIndexBuffer9 *This );
|
||||
/*** Direct3D public ***/
|
||||
|
||||
HRESULT WINAPI
|
||||
|
||||
@@ -39,56 +39,13 @@ NineVertexBuffer9_ctor( struct NineVertexBuffer9 *This,
|
||||
struct NineUnknownParams *pParams,
|
||||
D3DVERTEXBUFFER_DESC *pDesc )
|
||||
{
|
||||
struct pipe_resource *info = &This->base.info;
|
||||
HRESULT hr;
|
||||
|
||||
DBG("This=%p Size=0x%x Usage=%x Pool=%u\n", This,
|
||||
pDesc->Size, pDesc->Usage, pDesc->Pool);
|
||||
|
||||
user_assert(pDesc->Pool != D3DPOOL_SCRATCH, D3DERR_INVALIDCALL);
|
||||
|
||||
This->maps = MALLOC(sizeof(struct pipe_transfer *));
|
||||
if (!This->maps)
|
||||
return E_OUTOFMEMORY;
|
||||
This->nmaps = 0;
|
||||
This->maxmaps = 1;
|
||||
|
||||
This->pipe = pParams->device->pipe;
|
||||
|
||||
info->screen = pParams->device->screen;
|
||||
info->target = PIPE_BUFFER;
|
||||
info->format = PIPE_FORMAT_R8_UNORM;
|
||||
info->width0 = pDesc->Size;
|
||||
info->flags = 0;
|
||||
|
||||
info->bind = PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_TRANSFER_WRITE;
|
||||
if (!(pDesc->Usage & D3DUSAGE_WRITEONLY))
|
||||
info->bind |= PIPE_BIND_TRANSFER_READ;
|
||||
|
||||
info->usage = PIPE_USAGE_DEFAULT;
|
||||
if (pDesc->Usage & D3DUSAGE_DYNAMIC)
|
||||
info->usage = PIPE_USAGE_STREAM;
|
||||
if (pDesc->Pool == D3DPOOL_SYSTEMMEM)
|
||||
info->usage = PIPE_USAGE_STAGING;
|
||||
|
||||
/* if (pDesc->Usage & D3DUSAGE_DONOTCLIP) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_NONSECURE) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_NPATCHES) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_POINTS) { } */
|
||||
/* if (pDesc->Usage & D3DUSAGE_RTPATCHES) { } */
|
||||
if (pDesc->Usage & D3DUSAGE_SOFTWAREPROCESSING)
|
||||
DBG("Application asked for Software Vertex Processing, "
|
||||
"but this is unimplemented\n");
|
||||
/* if (pDesc->Usage & D3DUSAGE_TEXTAPI) { } */
|
||||
|
||||
info->height0 = 1;
|
||||
info->depth0 = 1;
|
||||
info->array_size = 1;
|
||||
info->last_level = 0;
|
||||
info->nr_samples = 0;
|
||||
|
||||
hr = NineResource9_ctor(&This->base, pParams, NULL, TRUE,
|
||||
D3DRTYPE_VERTEXBUFFER, pDesc->Pool, pDesc->Usage);
|
||||
hr = NineBuffer9_ctor(&This->base, pParams, D3DRTYPE_VERTEXBUFFER,
|
||||
pDesc->Usage, pDesc->Size, pDesc->Pool);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
@@ -102,85 +59,29 @@ NineVertexBuffer9_ctor( struct NineVertexBuffer9 *This,
|
||||
void
|
||||
NineVertexBuffer9_dtor( struct NineVertexBuffer9 *This )
|
||||
{
|
||||
if (This->maps) {
|
||||
while (This->nmaps) {
|
||||
NineVertexBuffer9_Unlock(This);
|
||||
}
|
||||
FREE(This->maps);
|
||||
}
|
||||
NineBuffer9_dtor(&This->base);
|
||||
}
|
||||
|
||||
NineResource9_dtor(&This->base);
|
||||
struct pipe_resource *
|
||||
NineVertexBuffer9_GetResource( struct NineVertexBuffer9 *This )
|
||||
{
|
||||
return NineBuffer9_GetResource(&This->base);
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
NineVertexBuffer9_Lock( struct NineVertexBuffer9 *This,
|
||||
UINT OffsetToLock,
|
||||
UINT SizeToLock,
|
||||
void **ppbData,
|
||||
DWORD Flags )
|
||||
UINT OffsetToLock,
|
||||
UINT SizeToLock,
|
||||
void **ppbData,
|
||||
DWORD Flags )
|
||||
{
|
||||
struct pipe_box box;
|
||||
void *data;
|
||||
const unsigned usage = d3dlock_buffer_to_pipe_transfer_usage(Flags);
|
||||
|
||||
DBG("This=%p(pipe=%p) OffsetToLock=0x%x, SizeToLock=0x%x, Flags=0x%x\n",
|
||||
This, This->base.resource,
|
||||
OffsetToLock, SizeToLock, Flags);
|
||||
|
||||
user_assert(ppbData, E_POINTER);
|
||||
user_assert(!(Flags & ~(D3DLOCK_DISCARD |
|
||||
D3DLOCK_DONOTWAIT |
|
||||
D3DLOCK_NO_DIRTY_UPDATE |
|
||||
D3DLOCK_NOSYSLOCK |
|
||||
D3DLOCK_READONLY |
|
||||
D3DLOCK_NOOVERWRITE)), D3DERR_INVALIDCALL);
|
||||
|
||||
if (This->nmaps == This->maxmaps) {
|
||||
struct pipe_transfer **newmaps =
|
||||
REALLOC(This->maps, sizeof(struct pipe_transfer *)*This->maxmaps,
|
||||
sizeof(struct pipe_transfer *)*(This->maxmaps << 1));
|
||||
if (newmaps == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
This->maxmaps <<= 1;
|
||||
This->maps = newmaps;
|
||||
}
|
||||
|
||||
if (SizeToLock == 0) {
|
||||
SizeToLock = This->desc.Size - OffsetToLock;
|
||||
user_warn(OffsetToLock != 0);
|
||||
}
|
||||
|
||||
u_box_1d(OffsetToLock, SizeToLock, &box);
|
||||
|
||||
data = This->pipe->transfer_map(This->pipe, This->base.resource, 0,
|
||||
usage, &box, &This->maps[This->nmaps]);
|
||||
if (!data) {
|
||||
DBG("pipe::transfer_map failed\n"
|
||||
" usage = %x\n"
|
||||
" box.x = %u\n"
|
||||
" box.width = %u\n",
|
||||
usage, box.x, box.width);
|
||||
/* not sure what to return, msdn suggests this */
|
||||
if (Flags & D3DLOCK_DONOTWAIT)
|
||||
return D3DERR_WASSTILLDRAWING;
|
||||
return D3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
This->nmaps++;
|
||||
*ppbData = data;
|
||||
|
||||
return D3D_OK;
|
||||
return NineBuffer9_Lock(&This->base, OffsetToLock, SizeToLock, ppbData, Flags);
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
NineVertexBuffer9_Unlock( struct NineVertexBuffer9 *This )
|
||||
{
|
||||
DBG("This=%p\n", This);
|
||||
|
||||
user_assert(This->nmaps > 0, D3DERR_INVALIDCALL);
|
||||
This->pipe->transfer_unmap(This->pipe, This->maps[--(This->nmaps)]);
|
||||
return D3D_OK;
|
||||
return NineBuffer9_Unlock(&This->base);
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
#ifndef _NINE_VERTEXBUFFER9_H_
|
||||
#define _NINE_VERTEXBUFFER9_H_
|
||||
|
||||
#include "resource9.h"
|
||||
#include "buffer9.h"
|
||||
|
||||
struct pipe_screen;
|
||||
struct pipe_context;
|
||||
@@ -31,13 +31,10 @@ struct pipe_transfer;
|
||||
|
||||
struct NineVertexBuffer9
|
||||
{
|
||||
struct NineResource9 base;
|
||||
struct NineBuffer9 base;
|
||||
|
||||
/* G3D */
|
||||
struct pipe_context *pipe;
|
||||
struct pipe_transfer **maps;
|
||||
int nmaps, maxmaps;
|
||||
|
||||
D3DVERTEXBUFFER_DESC desc;
|
||||
};
|
||||
static inline struct NineVertexBuffer9 *
|
||||
@@ -58,6 +55,12 @@ NineVertexBuffer9_ctor( struct NineVertexBuffer9 *This,
|
||||
|
||||
void
|
||||
NineVertexBuffer9_dtor( struct NineVertexBuffer9 *This );
|
||||
/*** Nine private ***/
|
||||
|
||||
struct pipe_resource *
|
||||
NineVertexBuffer9_GetResource( struct NineVertexBuffer9 *This );
|
||||
|
||||
/*** Direct3D public ***/
|
||||
|
||||
HRESULT WINAPI
|
||||
NineVertexBuffer9_Lock( struct NineVertexBuffer9 *This,
|
||||
|
||||
Reference in New Issue
Block a user