This, pParams, Width, Height, Depth, Levels,
Usage, Format, Pool, pSharedHandle);
- /* An IDirect3DVolume9 cannot be bound as a render target can it ? */
- user_assert(!(Usage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)),
- D3DERR_INVALIDCALL);
- user_assert(!(Usage & D3DUSAGE_AUTOGENMIPMAP) ||
- (Pool != D3DPOOL_SYSTEMMEM && Levels <= 1), D3DERR_INVALIDCALL);
+ user_assert(Width && Height && Depth, D3DERR_INVALIDCALL);
+ /* user_assert(!pSharedHandle || Pool == D3DPOOL_DEFAULT, D3DERR_INVALIDCALL); */
user_assert(!pSharedHandle, D3DERR_INVALIDCALL); /* TODO */
- if (Usage & D3DUSAGE_AUTOGENMIPMAP)
- Levels = 0;
+ /* An IDirect3DVolume9 cannot be bound as a render target can it ? */
+ user_assert(!(Usage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)),
+ D3DERR_INVALIDCALL);
+ user_assert(!(Usage & D3DUSAGE_AUTOGENMIPMAP), D3DERR_INVALIDCALL);
pf = d3d9_to_pipe_format_checked(screen, Format, PIPE_TEXTURE_3D, 0,
- PIPE_BIND_SAMPLER_VIEW, FALSE);
+ PIPE_BIND_SAMPLER_VIEW, FALSE,
+ Pool == D3DPOOL_SCRATCH);
+
if (pf == PIPE_FORMAT_NONE)
return D3DERR_INVALIDCALL;
- /* We support ATI1 and ATI2 hacks only for 2D textures */
+ /* We support ATI1 and ATI2 hacks only for 2D and Cube textures */
if (Format == D3DFMT_ATI1 || Format == D3DFMT_ATI2)
return D3DERR_INVALIDCALL;
+ if (compressed_format(Format)) {
+ const unsigned w = util_format_get_blockwidth(pf);
+ const unsigned h = util_format_get_blockheight(pf);
+ /* Compressed formats are not compressed on depth component */
+ user_assert(!(Width % w) && !(Height % h), D3DERR_INVALIDCALL);
+ }
+
info->screen = pParams->device->screen;
info->target = PIPE_TEXTURE_3D;
info->format = pf;
info->last_level = util_logbase2(MAX2(MAX2(Width, Height), Depth));
info->array_size = 1;
info->nr_samples = 0;
+ info->nr_storage_samples = 0;
info->bind = PIPE_BIND_SAMPLER_VIEW;
info->usage = PIPE_USAGE_DEFAULT;
info->flags = 0;
if (Usage & D3DUSAGE_DYNAMIC) {
info->usage = PIPE_USAGE_DYNAMIC;
- info->bind |=
- PIPE_BIND_TRANSFER_READ |
- PIPE_BIND_TRANSFER_WRITE;
}
if (Usage & D3DUSAGE_SOFTWAREPROCESSING)
DBG("Application asked for Software Vertex Processing, "
return hr;
}
+ /* Textures start initially dirty */
+ NineVolumeTexture9_AddDirtyBox(This, NULL);
+
return D3D_OK;
}
DBG("This=%p\n", This);
if (This->volumes) {
- for (l = 0; l < This->base.base.info.last_level; ++l)
- NineUnknown_Destroy(&This->volumes[l]->base);
+ for (l = 0; l <= This->base.base.info.last_level; ++l)
+ if (This->volumes[l])
+ NineUnknown_Destroy(&This->volumes[l]->base);
FREE(This->volumes);
}
NineBaseTexture9_dtor(&This->base);
}
-HRESULT WINAPI
+HRESULT NINE_WINAPI
NineVolumeTexture9_GetLevelDesc( struct NineVolumeTexture9 *This,
UINT Level,
D3DVOLUME_DESC *pDesc )
{
user_assert(Level <= This->base.base.info.last_level, D3DERR_INVALIDCALL);
- user_assert(Level == 0 || !(This->base.base.usage & D3DUSAGE_AUTOGENMIPMAP),
- D3DERR_INVALIDCALL);
*pDesc = This->volumes[Level]->desc;
return D3D_OK;
}
-HRESULT WINAPI
+HRESULT NINE_WINAPI
NineVolumeTexture9_GetVolumeLevel( struct NineVolumeTexture9 *This,
UINT Level,
IDirect3DVolume9 **ppVolumeLevel )
{
user_assert(Level <= This->base.base.info.last_level, D3DERR_INVALIDCALL);
- user_assert(Level == 0 || !(This->base.base.usage & D3DUSAGE_AUTOGENMIPMAP),
- D3DERR_INVALIDCALL);
NineUnknown_AddRef(NineUnknown(This->volumes[Level]));
*ppVolumeLevel = (IDirect3DVolume9 *)This->volumes[Level];
return D3D_OK;
}
-HRESULT WINAPI
+HRESULT NINE_WINAPI
NineVolumeTexture9_LockBox( struct NineVolumeTexture9 *This,
UINT Level,
D3DLOCKED_BOX *pLockedVolume,
This, Level, pLockedVolume, pBox, Flags);
user_assert(Level <= This->base.base.info.last_level, D3DERR_INVALIDCALL);
- user_assert(Level == 0 || !(This->base.base.usage & D3DUSAGE_AUTOGENMIPMAP),
- D3DERR_INVALIDCALL);
return NineVolume9_LockBox(This->volumes[Level], pLockedVolume, pBox,
Flags);
}
-HRESULT WINAPI
+HRESULT NINE_WINAPI
NineVolumeTexture9_UnlockBox( struct NineVolumeTexture9 *This,
UINT Level )
{
return NineVolume9_UnlockBox(This->volumes[Level]);
}
-HRESULT WINAPI
+HRESULT NINE_WINAPI
NineVolumeTexture9_AddDirtyBox( struct NineVolumeTexture9 *This,
const D3DBOX *pDirtyBox )
{
DBG("This=%p pDirtybox=%p\n", This, pDirtyBox);
- if (This->base.base.pool != D3DPOOL_MANAGED) {
- if (This->base.base.usage & D3DUSAGE_AUTOGENMIPMAP)
- This->base.dirty_mip = TRUE;
+ if (This->base.base.pool == D3DPOOL_DEFAULT) {
return D3D_OK;
}
- This->base.dirty = TRUE;
- BASETEX_REGISTER_UPDATE(&This->base);
+ if (This->base.base.pool == D3DPOOL_MANAGED) {
+ This->base.managed.dirty = TRUE;
+ BASETEX_REGISTER_UPDATE(&This->base);
+ }
if (!pDirtyBox) {
This->dirty_box.x = 0;
This->dirty_box.height = This->base.base.info.height0;
This->dirty_box.depth = This->base.base.info.depth0;
} else {
- struct pipe_box box;
- d3dbox_to_pipe_box(&box, pDirtyBox);
- u_box_union_3d(&This->dirty_box, &This->dirty_box, &box);
+ if (This->dirty_box.width == 0) {
+ d3dbox_to_pipe_box(&This->dirty_box, pDirtyBox);
+ } else {
+ struct pipe_box box;
+ d3dbox_to_pipe_box(&box, pDirtyBox);
+ u_box_union_3d(&This->dirty_box, &This->dirty_box, &box);
+ }
+ This->dirty_box.x = MAX2(This->dirty_box.x, 0);
+ This->dirty_box.y = MAX2(This->dirty_box.y, 0);
+ This->dirty_box.z = MAX2(This->dirty_box.z, 0);
+ This->dirty_box.width = MIN2(This->dirty_box.width,
+ This->base.base.info.width0 - This->dirty_box.x);
+ This->dirty_box.height = MIN2(This->dirty_box.height,
+ This->base.base.info.height0 - This->dirty_box.y);
+ This->dirty_box.depth = MIN2(This->dirty_box.depth,
+ This->base.base.info.depth0 - This->dirty_box.z);
}
return D3D_OK;
}
(void *)NineUnknown_AddRef,
(void *)NineUnknown_Release,
(void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
- (void *)NineResource9_SetPrivateData,
- (void *)NineResource9_GetPrivateData,
- (void *)NineResource9_FreePrivateData,
+ (void *)NineUnknown_SetPrivateData,
+ (void *)NineUnknown_GetPrivateData,
+ (void *)NineUnknown_FreePrivateData,
(void *)NineResource9_SetPriority,
(void *)NineResource9_GetPriority,
(void *)NineBaseTexture9_PreLoad,