static void test_D3DXFilterTexture(IDirect3DDevice9 *device) { IDirect3DTexture9 *tex; HRESULT hr; hr = IDirect3DDevice9_CreateTexture(device, 256, 256, 5, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &tex, NULL); if (SUCCEEDED(hr)) { hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_NONE); ok(hr == D3D_OK, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_BOX + 1); /* Invalid filter */ ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 5, D3DX_FILTER_NONE); /* Last miplevel */ ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 20, D3DX_FILTER_NONE); /* Invalid miplevel */ ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); } else skip("Failed to create texture\n"); IDirect3DTexture9_Release(tex); hr = D3DXFilterTexture(NULL, NULL, 0, D3DX_FILTER_NONE); ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); /* Test different pools */ hr = IDirect3DDevice9_CreateTexture(device, 256, 256, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &tex, NULL); if (SUCCEEDED(hr)) { hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_NONE); ok(hr == D3D_OK, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3D_OK); IDirect3DTexture9_Release(tex); } else skip("Failed to create texture\n"); hr = IDirect3DDevice9_CreateTexture(device, 256, 256, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &tex, NULL); if (SUCCEEDED(hr)) { hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_NONE); ok(hr == D3D_OK, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3D_OK); IDirect3DTexture9_Release(tex); } else skip("Failed to create texture\n"); }
static void createDummyTexD3D9() { HRESULT hr = IDirect3DDevice9_CreateTexture(gDevicePtr, 256, 256, 1, 0, D3DFMT_A8B8G8R8, D3DPOOL_MANAGED, &gTexturePtr, NULL); if (!gTexturePtr) { fprintf(stderr, "Unable to create texture, 0x%08lx\n", hr); killProcess(1); } }
CR_API CrBool crTextureInit(CrTexture* self, size_t width, size_t height, size_t mipCount, size_t surfCount, CrGpuFormat format, const void* data) { CrTextureImpl* impl = (CrTextureImpl*)self; if(self->flags & CrTexture_Inited) { crDbgStr("texture already inited!\n"); return CrFalse; } if(surfCount > 1) { crDbgStr("Current not support surfCount > 1!\n"); return CrFalse; } impl->apiFormatMapping = crTextureGpuFormatMappingGet(format); if(nullptr == impl->apiFormatMapping) { crDbgStr("Non supported texture format: %s\n", format); return CrFalse; } if(format & CrGpuFormat_Depth) { crDbgStr("No depth texture support for non-rtt texture\n", format); return CrFalse; } self->format = format; self->width = width; self->height = height; self->mipCount = mipCount; self->surfCount = surfCount; // calculate single surface size { size_t tmpw, tmph; self->surfSizeInByte = crTextureGetMipLevelOffset(self, self->mipCount+1, &tmpw, &tmph); } // create texture { HRESULT hr; hr = IDirect3DDevice9_CreateTexture(crContextImpl()->d3ddev, width, height, self->mipCount, 0, impl->apiFormatMapping->d3dFormat, D3DPOOL_DEFAULT, &impl->d3dtex, nullptr); if(FAILED(hr)) { crDbgStr("d3d9 failed to create texture %8x", hr); return CrFalse; } } self->flags = CrTexture_Inited; if(nullptr != data) return crTextureCommit(self, data); return CrTrue; }
static void test_surface_get_container(IDirect3DDevice9 *device_ptr) { IDirect3DTexture9 *texture_ptr = 0; IDirect3DSurface9 *surface_ptr = 0; void *container_ptr; HRESULT hr; hr = IDirect3DDevice9_CreateTexture(device_ptr, 128, 128, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture_ptr, 0); ok(SUCCEEDED(hr) && texture_ptr != NULL, "CreateTexture returned: hr %#lx, texture_ptr %p. " "Expected hr %#lx, texture_ptr != %p\n", hr, texture_ptr, D3D_OK, NULL); if (!texture_ptr || FAILED(hr)) goto cleanup; hr = IDirect3DTexture9_GetSurfaceLevel(texture_ptr, 0, &surface_ptr); ok(SUCCEEDED(hr) && surface_ptr != NULL, "GetSurfaceLevel returned: hr %#lx, surface_ptr %p. " "Expected hr %#lx, surface_ptr != %p\n", hr, surface_ptr, D3D_OK, NULL); if (!surface_ptr || FAILED(hr)) goto cleanup; /* These should work... */ container_ptr = (void *)0x1337c0d3; hr = IDirect3DSurface9_GetContainer(surface_ptr, &IID_IUnknown, &container_ptr); ok(SUCCEEDED(hr) && container_ptr == texture_ptr, "GetContainer returned: hr %#lx, container_ptr %p. " "Expected hr %#lx, container_ptr %p\n", hr, container_ptr, S_OK, texture_ptr); if (container_ptr && container_ptr != (void *)0x1337c0d3) IUnknown_Release((IUnknown *)container_ptr); container_ptr = (void *)0x1337c0d3; hr = IDirect3DSurface9_GetContainer(surface_ptr, &IID_IDirect3DResource9, &container_ptr); ok(SUCCEEDED(hr) && container_ptr == texture_ptr, "GetContainer returned: hr %#lx, container_ptr %p. " "Expected hr %#lx, container_ptr %p\n", hr, container_ptr, S_OK, texture_ptr); if (container_ptr && container_ptr != (void *)0x1337c0d3) IUnknown_Release((IUnknown *)container_ptr); container_ptr = (void *)0x1337c0d3; hr = IDirect3DSurface9_GetContainer(surface_ptr, &IID_IDirect3DBaseTexture9, &container_ptr); ok(SUCCEEDED(hr) && container_ptr == texture_ptr, "GetContainer returned: hr %#lx, container_ptr %p. " "Expected hr %#lx, container_ptr %p\n", hr, container_ptr, S_OK, texture_ptr); if (container_ptr && container_ptr != (void *)0x1337c0d3) IUnknown_Release((IUnknown *)container_ptr); container_ptr = (void *)0x1337c0d3; hr = IDirect3DSurface9_GetContainer(surface_ptr, &IID_IDirect3DTexture9, &container_ptr); ok(SUCCEEDED(hr) && container_ptr == texture_ptr, "GetContainer returned: hr %#lx, container_ptr %p. " "Expected hr %#lx, container_ptr %p\n", hr, container_ptr, S_OK, texture_ptr); if (container_ptr && container_ptr != (void *)0x1337c0d3) IUnknown_Release((IUnknown *)container_ptr); /* ...and this one shouldn't. This should return E_NOINTERFACE and set container_ptr to NULL */ container_ptr = (void *)0x1337c0d3; hr = IDirect3DSurface9_GetContainer(surface_ptr, &IID_IDirect3DSurface9, &container_ptr); ok(hr == E_NOINTERFACE && container_ptr == NULL, "GetContainer returned: hr %#lx, container_ptr %p. " "Expected hr %#lx, container_ptr %p\n", hr, container_ptr, E_NOINTERFACE, NULL); if (container_ptr && container_ptr != (void *)0x1337c0d3) IUnknown_Release((IUnknown *)container_ptr); cleanup: if (texture_ptr) IDirect3DTexture9_Release(texture_ptr); if (surface_ptr) IDirect3DSurface9_Release(surface_ptr); }
IDirect3DTexture9* iD3DMakeTexture( IDirect3DDevice9 *Device, void *Data, ILuint DLen, ILuint Width, ILuint Height, D3DFORMAT Format, D3DPOOL Pool, ILuint Levels ) { IDirect3DTexture9 *Texture; D3DLOCKED_RECT Rect; if (FAILED(IDirect3DDevice9_CreateTexture(Device, Width, Height, Levels, 0, Format, Pool, &Texture, NULL))) return NULL; if (FAILED(IDirect3DTexture9_LockRect(Texture, 0, &Rect, NULL, 0))) return NULL; memcpy(Rect.pBits, Data, DLen); IDirect3DTexture9_UnlockRect(Texture, 0); return Texture; }
static int D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) { D3D_RenderData *renderdata = (D3D_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; D3DFORMAT display_format = renderdata->pparams.BackBufferFormat; D3D_TextureData *data; D3DPOOL pool; DWORD usage; HRESULT result; data = (D3D_TextureData *) SDL_calloc(1, sizeof(*data)); if (!data) { SDL_OutOfMemory(); return -1; } data->scaleMode = GetScaleQuality(); texture->driverdata = data; #ifdef USE_DYNAMIC_TEXTURE if (texture->access == SDL_TEXTUREACCESS_STREAMING) { pool = D3DPOOL_DEFAULT; usage = D3DUSAGE_DYNAMIC; } else #endif if (texture->access == SDL_TEXTUREACCESS_TARGET) { /* D3DPOOL_MANAGED does not work with D3DUSAGE_RENDERTARGET */ pool = D3DPOOL_DEFAULT; usage = D3DUSAGE_RENDERTARGET; } else { pool = D3DPOOL_MANAGED; usage = 0; } result = IDirect3DDevice9_CreateTexture(renderdata->device, texture->w, texture->h, 1, usage, PixelFormatToD3DFMT(texture->format), pool, &data->texture, NULL); if (FAILED(result)) { D3D_SetError("CreateTexture()", result); return -1; } return 0; }
static int D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) { D3D_RenderData *renderdata = (D3D_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; SDL_VideoDisplay *display = window->display; Uint32 display_format = display->current_mode.format; D3D_TextureData *data; HRESULT result; data = (D3D_TextureData *) SDL_calloc(1, sizeof(*data)); if (!data) { SDL_OutOfMemory(); return -1; } texture->driverdata = data; if (SDL_ISPIXELFORMAT_FOURCC(texture->format) && (texture->format != SDL_PIXELFORMAT_YUY2 || !D3D_IsTextureFormatAvailable(renderdata->d3d, renderdata->adapter, display_format, texture->format)) && (texture->format != SDL_PIXELFORMAT_YVYU || !D3D_IsTextureFormatAvailable(renderdata->d3d, renderdata->adapter, display_format, texture->format))) { data->yuv = SDL_SW_CreateYUVTexture(texture->format, texture->w, texture->h); if (!data->yuv) { return -1; } data->format = display->current_mode.format; } else { data->format = texture->format; } result = IDirect3DDevice9_CreateTexture(renderdata->device, texture->w, texture->h, 1, 0, PixelFormatToD3DFMT(data->format), D3DPOOL_SDL, &data->texture, NULL); if (FAILED(result)) { D3D_SetError("CreateTexture()", result); return -1; } return 0; }
static void test_lod(IDirect3DDevice9 *device) { HRESULT hr; DWORD ret; IDirect3DTexture9 *texture; hr = IDirect3DDevice9_CreateTexture(device, 128, 128, 3, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture failed with %08x\n", hr); /* SetLOD is only supported on D3DPOOL_MANAGED textures, but it doesn't return a HRESULT, * so it can't return a normal error. Instead, the call is simply ignored */ ret = IDirect3DTexture9_SetLOD(texture, 0); ok(ret == 0, "IDirect3DTexture9_SetLOD returned %u, expected 0\n", ret); ret = IDirect3DTexture9_SetLOD(texture, 1); ok(ret == 0, "IDirect3DTexture9_SetLOD returned %u, expected 0\n", ret); ret = IDirect3DTexture9_SetLOD(texture, 2); ok(ret == 0, "IDirect3DTexture9_SetLOD returned %u, expected 0\n", ret); ret = IDirect3DTexture9_GetLOD(texture); ok(ret == 0, "IDirect3DTexture9_GetLOD returned %u, expected 0\n", ret); IDirect3DTexture9_Release(texture); }
void *d3d9_texture_new(void *_dev, const char *path, unsigned width, unsigned height, unsigned miplevels, unsigned usage, INT32 format, INT32 pool, unsigned filter, unsigned mipfilter, INT32 color_key, void *src_info_data, PALETTEENTRY *palette, bool want_mipmap) { LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)_dev; void *buf = NULL; if (path) { #ifdef HAVE_D3DX return d3d9_texture_new_from_file(_dev, path, width, height, miplevels, usage, (D3DFORMAT)format, (D3DPOOL)pool, filter, mipfilter, color_key, src_info_data, palette); #else return NULL; #endif } #ifndef _XBOX if (want_mipmap) usage |= D3DUSAGE_AUTOGENMIPMAP; #endif if (FAILED(IDirect3DDevice9_CreateTexture(dev, width, height, miplevels, usage, (D3DFORMAT)format, (D3DPOOL)pool, (struct IDirect3DTexture9**)&buf, NULL))) return NULL; return buf; }
int main(){ BOOL done = FALSE; MSG msg; IDirect3DDevice9 *device = NULL; IDirect3DSurface9 *main_rendertarget = NULL; D3DFORMAT format; float old_time = 0; /* render-to-texture-stuff */ IDirect3DTexture9 *rtt_texture; IDirect3DSurface9 *rtt_surface; IDirect3DTexture9 *rtt_32_texture; IDirect3DSurface9 *rtt_32_surface; /* textures used from mainloop */ int white, black; int odd_is_back_again[4]; int at_the_gathering_2003[4]; int o_d_d_in_your_face[4]; int world_domination[4]; int back_once_again[3]; int were_back; int cred[4]; int mad_props[4]; int not_eph[4]; int piss_the_fuck_off[11]; int hardcore; int refmap, refmap2; int eatyrcode; int code_0, code_1; int overlaytest; int circle_particle; /* special-textures */ int rtt_texture_id; int rtt_32_texture_id; int video_texture_id; int dilldall,dilldall2; int metaball_text; /* videos */ video *vid; /* 3d-scenes */ scene *fysikkfjall; scene *startblob; scene *inni_abstrakt; scene *korridor; scene *skjerm_rom; scene *bare_paa_lissom; format = D3DFMT_X8R8G8B8; device = d3dwin_open(TITLE, WIDTH, HEIGHT, format, FULLSCREEN); if(!device){ format = D3DFMT_A8R8G8B8; device = d3dwin_open(TITLE, WIDTH, HEIGHT, format, FULLSCREEN); if(!device){ format = D3DFMT_X1R5G5B5; device = d3dwin_open(TITLE, WIDTH, HEIGHT, format, FULLSCREEN); if(!device){ format = D3DFMT_R5G6B5; device = d3dwin_open(TITLE, WIDTH, HEIGHT, format, FULLSCREEN); if(!device) error("failed to initialize Direct3D9"); } } } #ifdef BIGSCREEN set_gamma(device,1.05f); #endif if (!BASS_Init(1, 44100, BASS_DEVICE_LATENCY, win, NULL)) error("failed to initialize BASS"); fp = file_open("worlddomination.ogg"); if (!fp) error("music-file not found"); music_file = BASS_StreamCreateFile(1, fp->data, 0, fp->size, 0); /*** music ***/ // if(!pest_open(win)) error("failed to initialize DirectSond"); // if(!pest_load("worlddomination.ogg",0)) error("failed to load music-file"); /*** subsystems ***/ init_tunnel(); video_init(); if(!init_particles(device)) error("failed to initialize"); if(!init_overlays(device)) error("f**k a duck"); if(!init_marching_cubes(device)) error("screw a kangaroo"); make_random_particles(particles, PARTICLES, vector_make(0,-180,0), 500); make_random_particles(particles2, PARTICLES2, vector_make(0,-180,0), 500); make_random_particles(particles3, PARTICLES3, vector_make(0,0,0), 800); /*** rendertextures ***/ if (IDirect3DDevice9_CreateTexture(device, 512, 256, 0,D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &rtt_texture, NULL)!=D3D_OK) error("failed to create rendertarget-texture"); if (IDirect3DTexture9_GetSurfaceLevel(rtt_texture,0,&rtt_surface)!=D3D_OK) error("could not get kvasi-backbuffer-surface"); if ((rtt_texture_id=texture_insert(device, "rendertexture.jpg", rtt_texture))==-1) error("fakk off!"); if(IDirect3DDevice9_CreateTexture(device,16,16,0,D3DUSAGE_RENDERTARGET|D3DUSAGE_AUTOGENMIPMAP,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT, &rtt_32_texture, NULL)!=D3D_OK) error("failed to create rendertarget-texture"); if(IDirect3DTexture9_GetSurfaceLevel(rtt_32_texture,0,&rtt_32_surface)!=D3D_OK) error("could not get kvasi-backbuffer-surface"); if((rtt_32_texture_id=texture_insert(device, "rendertexture2.jpg", rtt_32_texture))==-1) error("fakk off!"); /*** textures ***/ /* solid colors for fades etc */ if((white=texture_load(device,"white.png",FALSE))==-1) error("shjit!"); if((black=texture_load(device,"black.png",FALSE))==-1) error("shjit!"); /* textoverlays */ if((odd_is_back_again[0]=texture_load(device,"odd_is_back_again_0.png",FALSE))==-1) error("failed to load image"); if((odd_is_back_again[1]=texture_load(device,"odd_is_back_again_1.png",FALSE))==-1) error("failed to load image"); if((odd_is_back_again[2]=texture_load(device,"odd_is_back_again_2.png",FALSE))==-1) error("failed to load image"); if((odd_is_back_again[3]=texture_load(device,"odd_is_back_again_3.png",FALSE))==-1) error("failed to load image"); if((at_the_gathering_2003[0]=texture_load(device,"at_the_gathering_2003_0.png",FALSE))==-1) error("failed to load image"); if((at_the_gathering_2003[1]=texture_load(device,"at_the_gathering_2003_1.png",FALSE))==-1) error("failed to load image"); if((at_the_gathering_2003[2]=texture_load(device,"at_the_gathering_2003_2.png",FALSE))==-1) error("failed to load image"); if((at_the_gathering_2003[3]=texture_load(device,"at_the_gathering_2003_3.png",FALSE))==-1) error("failed to load image"); if((back_once_again[0]=texture_load(device,"back_once_again_0.png",TRUE))==-1) error("failed to load image"); if((back_once_again[1]=texture_load(device,"back_once_again_1.png",TRUE))==-1) error("failed to load image"); if((back_once_again[2]=texture_load(device,"back_once_again_2.png",TRUE))==-1) error("failed to load image"); if((o_d_d_in_your_face[0]=texture_load(device,"o_d_d_in_your_face_0.png",TRUE))==-1) error("failed to load image"); if((o_d_d_in_your_face[1]=texture_load(device,"o_d_d_in_your_face_1.png",TRUE))==-1) error("failed to load image"); if((o_d_d_in_your_face[2]=texture_load(device,"o_d_d_in_your_face_2.png",TRUE))==-1) error("failed to load image"); if((o_d_d_in_your_face[3]=texture_load(device,"o_d_d_in_your_face_3.png",TRUE))==-1) error("failed to load image"); if((world_domination[0]=texture_load(device,"world_domination_0.png",TRUE))==-1) error("failed to load image"); if((world_domination[1]=texture_load(device,"world_domination_1.png",TRUE))==-1) error("failed to load image"); if((world_domination[2]=texture_load(device,"world_domination_2.png",TRUE))==-1) error("failed to load image"); if((world_domination[3]=texture_load(device,"world_domination_3.png",TRUE))==-1) error("failed to load image"); if((were_back=texture_load(device,"were_back.png",TRUE))==-1) error("failed to load image"); if((cred[0]=texture_load(device,"cred_0.png",TRUE))==-1) error("failed to load image"); if((cred[1]=texture_load(device,"cred_1.png",TRUE))==-1) error("failed to load image"); if((cred[2]=texture_load(device,"cred_2.png",TRUE))==-1) error("failed to load image"); if((cred[3]=texture_load(device,"cred_3.png",TRUE))==-1) error("failed to load image"); if((mad_props[0]=texture_load(device,"mad_props_0.png",TRUE))==-1) error("failed to load image"); if((mad_props[1]=texture_load(device,"mad_props_1.png",TRUE))==-1) error("failed to load image"); if((mad_props[2]=texture_load(device,"mad_props_2.png",TRUE))==-1) error("failed to load image"); if((mad_props[3]=texture_load(device,"mad_props_3.png",TRUE))==-1) error("failed to load image"); if((not_eph[0]=texture_load(device,"not_eph_0.png",TRUE))==-1) error("failed to load image"); if((not_eph[1]=texture_load(device,"not_eph_1.png",TRUE))==-1) error("failed to load image"); if((not_eph[2]=texture_load(device,"not_eph_2.png",TRUE))==-1) error("failed to load image"); if((not_eph[3]=texture_load(device,"not_eph_3.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[0]=texture_load(device,"piss_the_fuck_off_0.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[1]=texture_load(device,"piss_the_fuck_off_1.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[2]=texture_load(device,"piss_the_fuck_off_2.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[3]=texture_load(device,"piss_the_fuck_off_3.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[4]=texture_load(device,"piss_the_fuck_off_4.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[5]=texture_load(device,"piss_the_fuck_off_5.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[6]=texture_load(device,"piss_the_fuck_off_6.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[7]=texture_load(device,"piss_the_fuck_off_7.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[8]=texture_load(device,"piss_the_fuck_off_8.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[9]=texture_load(device,"piss_the_fuck_off_9.png",TRUE))==-1) error("failed to load image"); if((piss_the_fuck_off[10]=texture_load(device,"piss_the_fuck_off_10.png",TRUE))==-1) error("failed to load image"); if((hardcore=texture_load(device,"hardcore.png",TRUE))==-1) error("failed to load image"); /* other textures */ if((circle_particle=texture_load(device,"circle_particle.jpg",FALSE))==-1) error("shjit!"); if((refmap=texture_load(device,"fysikkfjall/refmap.jpg",FALSE))==-1) error("shjit!"); if((refmap2=texture_load(device,"refmap2.jpg",FALSE))==-1) error("shjit!"); if((eatyrcode=texture_load(device,"eatyrcode.jpg",FULLSCREEN_HACK))==-1) error("shjit!"); if((code_0=texture_load(device,"code-0.jpg",FALSE))==-1) error("shjit!"); if((code_1=texture_load(device,"code-1.jpg",FALSE))==-1) error("shjit!"); if((overlaytest=texture_load(device,"overlaytest.jpg",FALSE))==-1) error("shjit!"); if((dilldall=texture_load(device,"dilldall.png",FALSE))==-1) error("shjit!"); if((dilldall2=texture_load(device,"dilldall2.png",FALSE))==-1) error("shjit!"); if((metaball_text=texture_load(device,"metaballs.png",TRUE))==-1) error("shjit!"); /*** video ***/ if(!(vid=video_load(device,"test.kpg"))) error("fæck!"); video_texture_id = texture_insert(device, "skjerm_rom/skjerm_tom.tga", vid->texture); /*** misc stuff ***/ /* main rendertarget */ IDirect3DDevice9_GetRenderTarget(device,0,&main_rendertarget); /* default state */ IDirect3DDevice9_CreateStateBlock(device, D3DSBT_ALL, &default_state); init_defaultstate(device); IDirect3DStateBlock9_Capture(default_state); /*** 3d scenes ***/ if(!(fysikkfjall=load_scene(device,"fysikkfjall/fysikkfjall.krs"))) error("failed to load 3d scene"); if(!(startblob=load_scene(device,"startblob/startblob.krs"))) error("failed to load 3d scene"); if(!(inni_abstrakt=load_scene(device,"inni_abstrakt/inni_abstrakt.krs"))) error("failed to load 3d scene"); if(!(korridor=load_scene(device,"korridor/korridor.krs"))) error("failed to load 3d scene"); if(!(skjerm_rom=load_scene(device,"skjerm_rom/skjerm_rom.krs"))) error("failed to load 3d scene"); if(!(bare_paa_lissom=load_scene(device,"bare_paa_lissom/bare_paa_lissom.krs"))) error("failed to load 3d scene"); // pest_play(); BASS_Start(); BASS_StreamPlay(music_file, 1, 0); do{ grid g; int i; matrix m, temp, temp_matrix; matrix marching_cubes_matrix; long long bytes_played = BASS_ChannelGetPosition(music_file); float time = bytes_played * (1.0 / (44100 * 2 * 2)); // float time = pest_get_pos()+0.05f; float delta_time = time-old_time; int beat = (int)(time*((float)BPM/60.f)); if(time_index<(sizeof(timetable)/4)){ while(timetable[time_index]<time) time_index++; } #ifdef _DEBUG printf("time: %2.2f, delta_time: %2.2f, time_index: %i, beat: %i \r",time,delta_time,time_index,beat); #endif IDirect3DDevice9_SetRenderTarget(device,0,main_rendertarget); IDirect3DStateBlock9_Apply(default_state); IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, 0, 1.0f, 0); // IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0f, 0); IDirect3DDevice9_BeginScene(device); #if 1 if(time_index<40){ if(time_index>0&&time_index<5){ draw_overlay(device,odd_is_back_again[time_index-1],0,0,1,FALSE); }else if(time_index>4&&time_index<19){ float itime = time*10; grid_flat(g,0,0); for(i=0;i<7;i++){ int scale = (time_index&1); grid_wave(g,(float)sin(itime-i+sin(i-itime))*0.3f*scale,(float)cos(itime*0.69f+i*0.733f)*0.3f*scale,7,(float)sin(itime+i*0.1f)*0.5f*scale); } draw_grid(device, g, odd_is_back_again[3], FALSE); }else if(time_index>=19){ float itime = (time-timetable[18])*0.5f; grid_flat(g,0,0); for(i=0;i<7;i++){ grid_wave(g,(float)sin(time-i+sin(i-time))*0.3f,(float)cos(time*0.69f+i*0.733f)*0.3f,7, itime*itime); } draw_grid(device, g, odd_is_back_again[3], FALSE); } if(time_index>20&&time_index<25){ draw_overlay(device,at_the_gathering_2003[(time_index-21)%4],0,0,1,TRUE); }else if(time_index>=25&&time_index<38){ float itime = time*10; grid_flat(g,0,0); for(i=0;i<10;i++){ int scale = (time_index&1); grid_wave(g,(float)sin(itime-i+sin(i-itime))*0.3f*scale,(float)cos(itime*0.69f+i*0.733f)*0.3f*scale,7,(float)sin(itime+i*0.1f)*0.5f*scale); } draw_grid(device,g,at_the_gathering_2003[3],TRUE); }else if(time_index>=38){ float itime = (time-timetable[37])*0.5f; grid_flat(g,0,0); for(i=0;i<10;i++){ grid_wave(g,(float)sin(time-i+sin(i-time))*0.3f,(float)cos(time*0.69f+i*0.733f)*0.3f,7, itime*itime); } draw_grid(device,g,at_the_gathering_2003[3],TRUE); } }else if(time_index<52){ animate_scene(inni_abstrakt,(time-timetable[39])); draw_scene(device,inni_abstrakt,0,TRUE); flash(device,white,time,timetable[39],1); if(time_index<43){ draw_overlay(device, back_once_again[(time_index-40)%3],0,0,1,FALSE); }else if(time_index<47){ draw_overlay(device, o_d_d_in_your_face[(time_index-43)%4],0,0,1,FALSE); }else if(time_index<51){ draw_overlay(device, world_domination[(time_index-47)%4],0,0,1,FALSE); }else{ draw_overlay(device, were_back,0,0,(time-timetable[51]),FALSE); } draw_overlay(device,dilldall,sin(sin(time)*0.07f+(((beat+1)/2)*0.8f)),sin(time*0.03337f+(((beat+1)/2)*0.14f)),0.5f,TRUE); draw_overlay(device,dilldall2,sin(sin(time*0.1f)*0.07f+time*0.1f+(((beat+1)/2)*0.8f)),sin(time*0.01337f+(((beat+1)/2)*0.14f)),0.5f,TRUE); }else if(time_index<69){ animate_scene(startblob,(time-timetable[39]-0.27f+((beat+1)&2))*0.74948f); startblob->cameras[0].fog = TRUE; startblob->cameras[0].fog_start = 100.f; startblob->cameras[0].fog_end = 700.f; if(time_index>=53 && time_index<66 && time_index&1 ){ float f = fade(timetable[time_index-1],1.7f,time,0.5f,0); f *= f; f *= 2; if(f>0.f) IDirect3DDevice9_SetRenderTarget(device,0,rtt_surface); draw_scene(device,startblob,0,TRUE); draw_particles(device, particles3, PARTICLES3, code_0); if(f>0.f){ IDirect3DDevice9_SetRenderTarget(device,0,main_rendertarget); draw_radialblur(device,0,0,f,0,rtt_texture_id, FALSE); } if(time_index<61) draw_overlay(device,cred[((time_index/2)-2)%4],0,0,f*3,FALSE); }else{ draw_scene(device,startblob,0,TRUE); draw_particles(device, particles3, PARTICLES3, circle_particle); } if(time_index>=54&& !(time_index&1)){ float f = fade(timetable[time_index-1],1.8f,time,1.f,0)*0.8f; IDirect3DDevice9_SetRenderTarget(device,0,rtt_32_surface); draw_scene(device,startblob,0,TRUE); draw_particles(device, particles3, PARTICLES3, code_0); IDirect3DDevice9_SetRenderTarget(device,0,main_rendertarget); IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); draw_overlay(device,rtt_32_texture_id,0,0,f,TRUE); draw_overlay(device,rtt_32_texture_id,0,0,f,TRUE); IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); } flash(device,were_back,time,timetable[51],2); flash(device,white,time,timetable[51],1); }else if(time_index<79){ for(i=0;i<BALLS;i++){ balls[i].pos.x = (float)sin(time+i-sin((float)i*0.1212111f))*0.35f; balls[i].pos.y = (float)cos(time-(float)i*0.29342111f)*0.35f; balls[i].pos.z = (float)sin(time*0.31121f+sin(i-time))*0.35f; balls[i].r = 0.15f + (float)sin(time+i)*0.01f; balls[i].pos = vector_normalize(balls[i].pos); balls[i].pos = vector_scale(balls[i].pos, (float)(cos(i*0.11131f-time*0.55311f)+sin(time+(float)sin(time-i+time*0.3f)))*0.2f ); } animate_scene(korridor,(time-timetable[68])*0.65f ); draw_scene(device,korridor,(beat/4)&1,TRUE); memcpy(temp,korridor->objects[korridor->object_count-1]->mat,sizeof(matrix)); matrix_scale(marching_cubes_matrix,vector_make(120,120,120)); matrix_multiply(marching_cubes_matrix,temp,marching_cubes_matrix); matrix_rotate(temp,vector_make(time,-time,time*0.5f+sin(time))); matrix_multiply(marching_cubes_matrix,marching_cubes_matrix,temp); IDirect3DDevice9_SetTransform( device, D3DTS_WORLD, (D3DMATRIX*)&marching_cubes_matrix ); fill_metafield_blur(balls, BALLS,0.98f); march_my_cubes_opt(balls, BALLS, 0.9f); IDirect3DDevice9_SetRenderState(device, D3DRS_CULLMODE, D3DCULL_NONE); set_texture(device,0,refmap2); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR ); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_ADD); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG2, D3DTA_CURRENT); draw_marched_cubes(device); flash(device,white,time,timetable[68],1); if(time_index>69&&time_index<74){ draw_overlay(device,mad_props[(time_index+2)%4],0,0,1,FALSE); }else if(time_index>73&&time_index<77){ draw_overlay(device,not_eph[(time_index+2)%4],0,0,1,FALSE); }else if(time_index==77){ float f = fade(timetable[76],2.5f,time,1,0); draw_overlay(device,not_eph[3],0,0,f,FALSE); } } if(time_index>77&&time_index<92){ float f = fade(timetable[77],timetable[78]-timetable[77],time,0,1); draw_overlay(device,eatyrcode,0,0,f,FALSE); if(time>109.5f){ IDirect3DStateBlock9_Apply(default_state); animate_particles(particles, PARTICLES, delta_time*30); animate_particles(particles2, PARTICLES2, delta_time*28); draw_particles(device, particles, PARTICLES, code_0); draw_particles(device, particles2, PARTICLES2, code_1); } if(time_index>79&&time_index<90){ draw_overlay(device,piss_the_fuck_off[(time_index-80)%11],0,0,1,FALSE); }else if(time_index==90){ float f = fade(timetable[89],2,time,1,0); draw_overlay(device,piss_the_fuck_off[10],0,0,f,FALSE); } if(time_index==91){ float f = fade(timetable[90],2,time,1,0); draw_overlay(device,hardcore,0,0,f,FALSE); } }else if(time_index>91 && time_index<97){ animate_scene(skjerm_rom,time); video_update(vid, time); draw_scene(device,skjerm_rom,((beat/4)&1),TRUE); draw_overlay(device,dilldall,sin(sin(time)*0.07f+(((beat+1)/2)*0.8f)),sin(time*0.03337f+(((beat+1)/2)*0.14f)),0.5f,TRUE); draw_overlay(device,dilldall2,sin(sin(time*0.1f)*0.07f+time*0.1f+(((beat+1)/2)*0.8f)),sin(time*0.01337f+(((beat+1)/2)*0.14f)),0.5f,TRUE); if(time_index>92) draw_overlay(device, world_domination[(time_index-93)%4],0,0,1,FALSE); }else if(time_index>96&&time_index<104){ grid_zero(g); matrix_translate(m, vector_make(cos(time)*1.5f, sin(time)*1.5f,time*10)); matrix_rotate(temp_matrix, vector_make(sin(time*0.8111f)*0.2f,sin(time*1.2f)*0.2f,time)); matrix_multiply(m,m,temp_matrix); render_tunnel(g,m); matrix_rotate(temp_matrix, vector_make(0,M_PI,0)); matrix_multiply(m,m,temp_matrix); render_tunnel(g,m); matrix_rotate(temp_matrix, vector_make(M_PI,0,0)); matrix_multiply(m,m,temp_matrix); render_tunnel(g,m); grid_add_noice(g,sin(time)*0.1f); draw_grid(device, g, circle_particle, FALSE); if(time_index>97&&time_index<102){ float f = 1; if(time_index==101) f = fade(timetable[100],3,time,1,0); draw_overlay(device, o_d_d_in_your_face[(time_index-42)%4],0,0,f,FALSE); } } if(time_index>101 && time_index<104){ float f = fade(timetable[101],8,time,0,1); float f2 = fade(timetable[101],4,time,0,1); draw_overlay(device,black,0,0,f2,FALSE); IDirect3DDevice9_SetRenderTarget(device,0,rtt_surface); IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0, 1.0f, 0); IDirect3DStateBlock9_Apply(default_state); animate_scene(bare_paa_lissom,time-timetable[101]); draw_scene(device,bare_paa_lissom,0,TRUE); time *=0.5f; for(i=0;i<BALLS2;i++){ balls2[i].pos.x = (float)sin(time+i-sin((float)i*0.1212111f))*0.35f; balls2[i].pos.y = (float)cos(time-(float)i*0.29342111f)*0.35f; balls2[i].pos.z = (float)sin(time*0.31121f+sin(i-time))*0.35f; balls2[i].r = 0.15f + (float)sin(time+i)*0.01f; balls2[i].pos = vector_normalize(balls2[i].pos); balls2[i].pos = vector_scale(balls2[i].pos, (float)(cos(i*0.11131f-time*0.55311f)+sin(time+(float)sin(time-i+time*0.3f)))*0.2f ); } memcpy(temp,bare_paa_lissom->objects[bare_paa_lissom->object_count-1]->mat,sizeof(matrix)); matrix_scale(marching_cubes_matrix,vector_make(120,120,120)); matrix_multiply(marching_cubes_matrix,temp,marching_cubes_matrix); IDirect3DDevice9_SetTransform( device, D3DTS_WORLD, (D3DMATRIX*)&marching_cubes_matrix ); fill_metafield(balls2, BALLS2); march_my_cubes_opt(balls2, BALLS2, 0.9f); IDirect3DDevice9_SetRenderState(device, D3DRS_CULLMODE, D3DCULL_NONE); set_texture(device,0,refmap); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR ); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_ADD); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG2, D3DTA_CURRENT); draw_marched_cubes(device); IDirect3DDevice9_SetRenderTarget(device,0,main_rendertarget); draw_overlay(device,rtt_texture_id,0,0,f,TRUE); if(time_index==103){ float f; time *= 2; f = fade(timetable[time_index-1],3,time,1,0); draw_overlay(device,metaball_text,0,0,f,FALSE); flash(device,white,time,timetable[time_index-1],1); } } if(time_index==104){ float f = fade(timetable[103],timetable[104]-timetable[103],time,0,1); animate_scene(korridor,180-(time-timetable[time_index-1])*0.8f ); draw_scene(device,korridor,(beat/4)&1,TRUE); draw_overlay(device,black,0,0,f,FALSE); } if(time_index==105){ float f = fade(timetable[104],timetable[105]-timetable[104],time,0,1); float t = (time-timetable[time_index-1])*0.6f+2.2f; animate_scene(fysikkfjall,t); draw_scene(device,fysikkfjall,0,TRUE); draw_overlay(device,black,0,0,f,FALSE); } #endif /* */ /* draw_overlay(device, were_back, (1+sin(time))*0.5f, TRUE); */ // animate_scene(risterom,time); // draw_scene(device,risterom,0,TRUE); #if 0 //helvete_har_frosset draw_overlay(device, eatyrcode, 1,FALSE); IDirect3DStateBlock9_Apply(default_state); animate_particles(particles, PARTICLES, delta_time*30); animate_particles(particles2, PARTICLES2, delta_time*28); draw_particles(device, particles, PARTICLES, code_0); draw_particles(device, particles2, PARTICLES2, code_1); #endif #ifdef pikk // IDirect3DDevice9_SetRenderTarget(device,0,rtt_surface); IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0, 1.0f, 0); draw_overlay(device, eatyrcode, TRUE); animate_scene(startblob,(time-timetable[39]-0.27f)*0.7453f); draw_scene(device,startblob,0,FALSE); draw_particles(device, particles, PARTICLES, code_0); draw_particles(device, particles2, PARTICLES2, code_1); // IDirect3DDevice9_SetRenderTarget(device,0,main_rendertarget); /* draw_radialblur(device, (float)sin(time)*0.2f, (float)sin(-time*0.331f)*0.13f, (float)(2+(float)sin(time*0.5f))*0.2f, 0,//sin(time)*0.25f, rtt_texture_id, TRUE); animate_scene(fysikkfjall,time); draw_scene(device,fysikkfjall,0,FALSE); */ // draw_overlay(device, rtt_texture_id, TRUE); #endif // draw_overlay(device, eatyrcode, FALSE); // video_update(vid, time); #if 0 // IDirect3DDevice9_SetRenderTarget(device,0,rtt_surface); animate_scene(testscene,time); // morph_object(testscene->objects[0], time ); draw_scene(device,testscene,0,TRUE); // draw_particles(device, particles, PARTICLES, particle); // IDirect3DDevice9_SetRenderTarget(device,0,main_rendertarget); #endif #if 0 time *=0.5f; for(i=0;i<BALLS2;i++){ balls2[i].pos.x = (float)sin(time+i-sin((float)i*0.1212111f))*0.35f; balls2[i].pos.y = (float)cos(time-(float)i*0.29342111f)*0.35f; balls2[i].pos.z = (float)sin(time*0.31121f+sin(i-time))*0.35f; balls2[i].r = 0.15f + (float)sin(time+i)*0.01f; balls2[i].pos = vector_normalize(balls2[i].pos); balls2[i].pos = vector_scale(balls2[i].pos, (float)(cos(i*0.11131f-time*0.55311f)+sin(time+(float)sin(time-i+time*0.3f)))*0.2f ); // balls2[i].pos.x *= 2.8f; } matrix_translate(temp,vector_make(0,0,87)); matrix_scale(marching_cubes_matrix,vector_make(50,50,50)); matrix_multiply(marching_cubes_matrix,temp,marching_cubes_matrix); IDirect3DDevice9_SetTransform( device, D3DTS_WORLD, (D3DMATRIX*)&marching_cubes_matrix ); fill_metafield(balls2, BALLS2); // fill_metafield_blur(balls, BALLS,0.98f); march_my_cubes_opt(balls2, BALLS2, 0.9f); // march_my_cubes(0.9f); IDirect3DDevice9_SetRenderState(device, D3DRS_CULLMODE, D3DCULL_CW); set_texture(device,0,refmap); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR ); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_ADD); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG2, D3DTA_CURRENT); draw_marched_cubes(device); #endif #if 0 // time *= 0.5f; grid_zero(g); // for(i=0;i<10;i++) // grid_wave(g,sin(time-i+sin(i-time))*0.3f,cos(time*0.69f+i*0.733f)*0.3f,7,sin(time+i*0.1f)*0.5f); matrix_translate(m, vector_make(cos(time)*1.5f, sin(time)*1.5f,time*10)); matrix_rotate(temp_matrix, vector_make(sin(time*0.8111f)*0.2f,sin(time*1.2f)*0.2f,time)); matrix_multiply(m,m,temp_matrix); // empty_grid( grid ); render_tunnel(g,m); matrix_rotate(temp_matrix, vector_make(0,M_PI,0)); matrix_multiply(m,m,temp_matrix); render_tunnel(g,m); matrix_rotate(temp_matrix, vector_make(M_PI,0,0)); matrix_multiply(m,m,temp_matrix); render_tunnel(g,m); // tyfuus_expand_grid( screen, grid, texture ); grid_add_noice(g,sin(time)*0.1f); draw_grid(device, g, circle_particle, FALSE); #endif // IDirect3DDevice9_SetRenderTarget(device,0,main_rendertarget); // video_update(vid,time); /* draw_radialblur(device, (float)sin(time)*0.2f, (float)sin(-time*0.331f)*0.13f, (float)(1+(float)sin(time*0.5f))*0.2f, 0,//sin(time)*0.25f, rtt_texture_id, FALSE); */ // IDirect3DStateBlock9_Apply(default_state); // draw_overlay(device,rtt_texture_id,FALSE); // draw_overlay(device,fullscreen,FALSE); // draw_radialblur(device,0,sin(time*0.2f)*2.f, rtt_texture_id); // IDirect3DDevice9_StretchRect(device,main_rendertarget,NULL,rtt_surface,NULL,D3DTEXF_NONE); // IDirect3DBaseTexture9_GenerateMipSubLevels(rtt_texture); IDirect3DDevice9_EndScene(device); if(IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL)==D3DERR_DEVICELOST) error("fakkin lost device. keep your hands off alt-tab, looser."); old_time = time; while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)){ TranslateMessage(&msg); DispatchMessage(&msg); if (msg.message == WM_QUIT || msg.message == WM_KEYDOWN && LOWORD(msg.wParam) == VK_ESCAPE) done = TRUE; } }while(!done); deinit_marching_cubes(); deinit_overlays(); deinit_particles(); free_scene(fysikkfjall); free_scene(startblob); free_scene(inni_abstrakt); free_scene(korridor); free_scene(skjerm_rom); free_scene(bare_paa_lissom); free_materials(); free_textures(); free_video(vid); rtt_surface->lpVtbl->Release(rtt_surface); rtt_32_surface->lpVtbl->Release(rtt_32_surface); main_rendertarget->lpVtbl->Release(main_rendertarget); IDirect3DStateBlock9_Release(default_state); d3dwin_close(); if (music_file) BASS_StreamFree( music_file ); if (fp) file_close( fp ); BASS_Free(); // pest_close(); return 0; }
IDirect3DTexture9* ILAPIENTRY ilutD3D9Texture(IDirect3DDevice9 *Device) { IDirect3DTexture9 *Texture; // D3DLOCKED_RECT Rect; D3DFORMAT Format; ILimage *Image; ILenum DXTCFormat; ILuint Size; ILubyte *Buffer; Image = ilutCurImage = ilGetCurImage(); if (ilutCurImage == NULL) { ilSetError(ILUT_ILLEGAL_OPERATION); return NULL; } if (!FormatsDX9Checked) CheckFormatsDX9(Device); if (ilutGetBoolean(ILUT_D3D_USE_DXTC) && FormatsDX9supported[3] && FormatsDX9supported[4] && FormatsDX9supported[5]) { if (ilutCurImage->DxtcData != NULL && ilutCurImage->DxtcSize != 0) { ILuint dxtcFormat = ilutGetInteger(ILUT_DXTC_FORMAT); Format = D3DGetDXTCNumDX9(ilutCurImage->DxtcFormat); ilutSetInteger(ILUT_DXTC_FORMAT, ilutCurImage->DxtcFormat); Texture = iD3DMakeTexture(Device, ilutCurImage->DxtcData, ilutCurImage->DxtcSize, ilutCurImage->Width, ilutCurImage->Height, Format, ilutGetInteger(ILUT_D3D_POOL) == D3DPOOL_DEFAULT ? D3DPOOL_SYSTEMMEM : ilutGetInteger(ILUT_D3D_POOL), ilutGetInteger(ILUT_D3D_MIPLEVELS)); if (!Texture) return NULL; iD3D9CreateMipmaps(Texture, Image); if (ilutGetInteger(ILUT_D3D_POOL) == D3DPOOL_DEFAULT) { IDirect3DTexture9 *SysTex = Texture; // copy texture to device memory if (FAILED(IDirect3DDevice9_CreateTexture(Device, ilutCurImage->Width, ilutCurImage->Height, ilutGetInteger(ILUT_D3D_MIPLEVELS), 0, Format, D3DPOOL_DEFAULT, &Texture, NULL))) { IDirect3DTexture9_Release(SysTex); return NULL; } if (FAILED(IDirect3DDevice9_UpdateTexture(Device, (LPDIRECT3DBASETEXTURE9)SysTex, (LPDIRECT3DBASETEXTURE9)Texture))) { IDirect3DTexture9_Release(SysTex); return NULL; } IDirect3DTexture9_Release(SysTex); } ilutSetInteger(ILUT_DXTC_FORMAT, dxtcFormat); goto success; } if (ilutGetBoolean(ILUT_D3D_GEN_DXTC)) { DXTCFormat = ilutGetInteger(ILUT_DXTC_FORMAT); /* Image = MakeD3D9Compliant(Device, &Format); if (Image == NULL) { if (Image != ilutCurImage) ilCloseImage(Image); return NULL; } */ Size = ilGetDXTCData(NULL, 0, DXTCFormat); if (Size != 0) { Buffer = (ILubyte*)ialloc(Size); if (Buffer == NULL) return NULL; Size = ilGetDXTCData(Buffer, Size, DXTCFormat); if (Size == 0) { ifree(Buffer); return NULL; } Format = D3DGetDXTCNumDX9(DXTCFormat); Texture = iD3DMakeTexture(Device, Buffer, Size, ilutCurImage->Width, ilutCurImage->Height, Format, ilutGetInteger(ILUT_D3D_POOL) == D3DPOOL_DEFAULT ? D3DPOOL_SYSTEMMEM : ilutGetInteger(ILUT_D3D_POOL), ilutGetInteger(ILUT_D3D_MIPLEVELS)); if (!Texture) return NULL; iD3D9CreateMipmaps(Texture, Image); if (ilutGetInteger(ILUT_D3D_POOL) == D3DPOOL_DEFAULT) { IDirect3DTexture9 *SysTex = Texture; if (FAILED(IDirect3DDevice9_CreateTexture(Device, ilutCurImage->Width, ilutCurImage->Height, ilutGetInteger(ILUT_D3D_MIPLEVELS), 0, Format, D3DPOOL_DEFAULT, &Texture, NULL))) { IDirect3DTexture9_Release(SysTex); return NULL; } if (FAILED(IDirect3DDevice9_UpdateTexture(Device, (LPDIRECT3DBASETEXTURE9)SysTex, (LPDIRECT3DBASETEXTURE9)Texture))) { IDirect3DTexture9_Release(SysTex); return NULL; } IDirect3DTexture9_Release(SysTex); } goto success; } } } Image = MakeD3D9Compliant(Device, &Format); if (Image == NULL) { if (Image != ilutCurImage) ilCloseImage(Image); return NULL; } Texture = iD3DMakeTexture(Device, Image->Data, Image->SizeOfPlane, Image->Width, Image->Height, Format, ilutGetInteger(ILUT_D3D_POOL) == D3DPOOL_DEFAULT ? D3DPOOL_SYSTEMMEM : ilutGetInteger(ILUT_D3D_POOL), ilutGetInteger(ILUT_D3D_MIPLEVELS)); if (!Texture) return NULL; iD3D9CreateMipmaps(Texture, Image); if (ilutGetInteger(ILUT_D3D_POOL) == D3DPOOL_DEFAULT) { IDirect3DTexture9 *SysTex = Texture; // create texture in system memory if (FAILED(IDirect3DDevice9_CreateTexture(Device, Image->Width, Image->Height, ilutGetInteger(ILUT_D3D_MIPLEVELS), 0, Format, ilutGetInteger(ILUT_D3D_POOL), &Texture, NULL))) { IDirect3DTexture9_Release(SysTex); return NULL; } if (FAILED(IDirect3DDevice9_UpdateTexture(Device, (LPDIRECT3DBASETEXTURE9)SysTex, (LPDIRECT3DBASETEXTURE9)Texture))) { IDirect3DTexture9_Release(SysTex); return NULL; } IDirect3DTexture9_Release(SysTex); } // if (Image != ilutCurImage) // ilCloseImage(Image); success: if (Image != ilutCurImage) ilCloseImage(Image); return Texture; }
/** * It allocates and initializes the resources needed to render the scene. */ static int Direct3DCreateScene(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev; HRESULT hr; /* * Create a texture for use when rendering a scene * for performance reason, texture format is identical to backbuffer * which would usually be a RGB format */ LPDIRECT3DTEXTURE9 d3dtex; hr = IDirect3DDevice9_CreateTexture(d3ddev, sys->d3dpp.BackBufferWidth, sys->d3dpp.BackBufferHeight, 1, D3DUSAGE_RENDERTARGET, sys->d3dpp.BackBufferFormat, D3DPOOL_DEFAULT, &d3dtex, NULL); if (FAILED(hr)) { msg_Err(vd, "Failed to create texture. (hr=0x%lx)", hr); return VLC_EGENERIC; } /* ** Create a vertex buffer for use when rendering scene */ LPDIRECT3DVERTEXBUFFER9 d3dvtc; hr = IDirect3DDevice9_CreateVertexBuffer(d3ddev, sizeof(CUSTOMVERTEX)*4, D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &d3dvtc, NULL); if (FAILED(hr)) { msg_Err(vd, "Failed to create vertex buffer. (hr=0x%lx)", hr); IDirect3DTexture9_Release(d3dtex); return VLC_EGENERIC; } /* */ sys->d3dtex = d3dtex; sys->d3dvtc = d3dvtc; // Texture coordinates outside the range [0.0, 1.0] are set // to the texture color at 0.0 or 1.0, respectively. IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); // Set linear filtering quality IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); // set maximum ambient light IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_AMBIENT, D3DCOLOR_XRGB(255,255,255)); // Turn off culling IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_CULLMODE, D3DCULL_NONE); // Turn off the zbuffer IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ZENABLE, D3DZB_FALSE); // Turn off lights IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_LIGHTING, FALSE); // Enable dithering IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_DITHERENABLE, TRUE); // disable stencil IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_STENCILENABLE, FALSE); // manage blending IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ALPHABLENDENABLE, TRUE); IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ALPHATESTENABLE,TRUE); IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ALPHAREF, 0x10); IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ALPHAFUNC,D3DCMP_GREATER); // Set texture states IDirect3DDevice9_SetTextureStageState(d3ddev, 0, D3DTSS_COLOROP,D3DTOP_MODULATE); IDirect3DDevice9_SetTextureStageState(d3ddev, 0, D3DTSS_COLORARG1,D3DTA_TEXTURE); IDirect3DDevice9_SetTextureStageState(d3ddev, 0, D3DTSS_COLORARG2,D3DTA_DIFFUSE); // turn off alpha operation IDirect3DDevice9_SetTextureStageState(d3ddev, 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); msg_Dbg(vd, "Direct3D scene created successfully"); return VLC_SUCCESS; }
static int D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { D3D_TextureData *data = (D3D_TextureData *) texture->driverdata; D3D_RenderData *renderdata = (D3D_RenderData *) renderer->driverdata; if (data->yuv) { if (SDL_SW_UpdateYUVTexture(data->yuv, rect, pixels, pitch) < 0) { return -1; } UpdateYUVTextureData(texture); return 0; } else { #ifdef SDL_MEMORY_POOL_DEFAULT IDirect3DTexture9 *temp; RECT d3drect; D3DLOCKED_RECT locked; const Uint8 *src; Uint8 *dst; int row, length; HRESULT result; result = IDirect3DDevice9_CreateTexture(renderdata->device, texture->w, texture->h, 1, 0, PixelFormatToD3DFMT(texture-> format), D3DPOOL_SYSTEMMEM, &temp, NULL); if (FAILED(result)) { D3D_SetError("CreateTexture()", result); return -1; } d3drect.left = rect->x; d3drect.right = rect->x + rect->w; d3drect.top = rect->y; d3drect.bottom = rect->y + rect->h; result = IDirect3DTexture9_LockRect(temp, 0, &locked, &d3drect, 0); if (FAILED(result)) { IDirect3DTexture9_Release(temp); D3D_SetError("LockRect()", result); return -1; } src = pixels; dst = locked.pBits; length = rect->w * SDL_BYTESPERPIXEL(texture->format); for (row = 0; row < rect->h; ++row) { SDL_memcpy(dst, src, length); src += pitch; dst += locked.Pitch; } IDirect3DTexture9_UnlockRect(temp, 0); result = IDirect3DDevice9_UpdateTexture(renderdata->device, (IDirect3DBaseTexture9 *) temp, (IDirect3DBaseTexture9 *) data->texture); IDirect3DTexture9_Release(temp); if (FAILED(result)) { D3D_SetError("UpdateTexture()", result); return -1; } #else RECT d3drect; D3DLOCKED_RECT locked; const Uint8 *src; Uint8 *dst; int row, length; HRESULT result; d3drect.left = rect->x; d3drect.right = rect->x + rect->w; d3drect.top = rect->y; d3drect.bottom = rect->y + rect->h; result = IDirect3DTexture9_LockRect(data->texture, 0, &locked, &d3drect, 0); if (FAILED(result)) { D3D_SetError("LockRect()", result); return -1; } src = pixels; dst = locked.pBits; length = rect->w * SDL_BYTESPERPIXEL(texture->format); for (row = 0; row < rect->h; ++row) { SDL_memcpy(dst, src, length); src += pitch; dst += locked.Pitch; } IDirect3DTexture9_UnlockRect(data->texture, 0); #endif // SDL_MEMORY_POOL_DEFAULT return 0; } }
static void test_mipmap_gen(IDirect3DDevice9 *device) { HRESULT hr; IDirect3D9 *d3d9; IDirect3DTexture9 *texture = NULL; IDirect3DSurface9 *surface; DWORD levels; D3DSURFACE_DESC desc; int i; D3DLOCKED_RECT lr; hr = IDirect3DDevice9_GetDirect3D(device, &d3d9); ok(hr == D3D_OK, "IDirect3DDevice9_GetDirect3D returned %#x\n", hr); hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_AUTOGENMIPMAP, D3DRTYPE_TEXTURE, D3DFMT_X8R8G8B8); if(FAILED(hr)) { skip("No mipmap generation support\n"); return; } /* testing shows that autogenmipmap and rendertarget are mutually exclusive options */ hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 0, (D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP), D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture returned 0x%08x, expected 0x%08x\n", hr, D3D_OK); if (texture) IDirect3DTexture9_Release(texture); texture = NULL; hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 0, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture failed(%08x)\n", hr); if (SUCCEEDED(hr)) { D3DTEXTUREFILTERTYPE fltt; fltt = IDirect3DTexture9_GetAutoGenFilterType(texture); ok(D3DTEXF_LINEAR == fltt /* || broken(D3DTEXF_POINT == fltt)*/, "GetAutoGenFilterType returned default %d\n", fltt); hr = IDirect3DTexture9_SetAutoGenFilterType(texture, D3DTEXF_NONE); todo_wine ok(hr == D3DERR_INVALIDCALL, "SetAutoGenFilterType D3DTEXF_NONE returned %08x\n", hr); hr = IDirect3DTexture9_SetAutoGenFilterType(texture, D3DTEXF_ANISOTROPIC); ok(hr == D3D_OK, "SetAutoGenFilterType D3DTEXF_ANISOTROPIC returned %08x\n", hr); fltt = IDirect3DTexture9_GetAutoGenFilterType(texture); ok(D3DTEXF_ANISOTROPIC == fltt, "GetAutoGenFilterType returned %d\n", fltt); hr = IDirect3DTexture9_SetAutoGenFilterType(texture, D3DTEXF_LINEAR); ok(hr == D3D_OK, "SetAutoGenFilterType D3DTEXF_LINEAR returned %08x\n", hr); } levels = IDirect3DTexture9_GetLevelCount(texture); ok(levels == 1, "Got %d levels, expected 1\n", levels); for(i = 0; i < 6 /* 64 = 2 ^ 6 */; i++) { surface = NULL; hr = IDirect3DTexture9_GetSurfaceLevel(texture, i, &surface); ok(hr == (i == 0 ? D3D_OK : D3DERR_INVALIDCALL), "GetSurfaceLevel on level %d returned %#x\n", i, hr); if(surface) IDirect3DSurface9_Release(surface); hr = IDirect3DTexture9_GetLevelDesc(texture, i, &desc); ok(hr == (i == 0 ? D3D_OK : D3DERR_INVALIDCALL), "GetLevelDesc on level %d returned %#x\n", i, hr); hr = IDirect3DTexture9_LockRect(texture, i, &lr, NULL, 0); ok(hr == (i == 0 ? D3D_OK : D3DERR_INVALIDCALL), "LockRect on level %d returned %#x\n", i, hr); if(SUCCEEDED(hr)) { hr = IDirect3DTexture9_UnlockRect(texture, i); ok(hr == D3D_OK, "Unlock returned %08x\n", hr); } } IDirect3DTexture9_Release(texture); hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 2 /* levels */, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_CreateTexture(levels = 2) returned %08x\n", hr); hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 6 /* levels */, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_CreateTexture(levels = 6) returned %08x\n", hr); hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 1 /* levels */, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture(levels = 1) returned %08x\n", hr); levels = IDirect3DTexture9_GetLevelCount(texture); ok(levels == 1, "Got %d levels, expected 1\n", levels); IDirect3DTexture9_Release(texture); }
static void Direct3DImportSubpicture(vout_display_t *vd, int *count_ptr, d3d_region_t **region, subpicture_t *subpicture) { vout_display_sys_t *sys = vd->sys; int count = 0; for (subpicture_region_t *r = subpicture->p_region; r; r = r->p_next) count++; *count_ptr = count; *region = calloc(count, sizeof(**region)); if (*region == NULL) { *count_ptr = 0; return; } int i = 0; for (subpicture_region_t *r = subpicture->p_region; r; r = r->p_next, i++) { d3d_region_t *d3dr = &(*region)[i]; HRESULT hr; d3dr->texture = NULL; for (int j = 0; j < sys->d3dregion_count; j++) { d3d_region_t *cache = &sys->d3dregion[j]; if (cache->texture && cache->format == sys->d3dregion_format && cache->width == r->fmt.i_visible_width && cache->height == r->fmt.i_visible_height) { #ifndef NDEBUG msg_Dbg(vd, "Reusing %dx%d texture for OSD", cache->width, cache->height); #endif *d3dr = *cache; memset(cache, 0, sizeof(*cache)); } } if (!d3dr->texture) { d3dr->format = sys->d3dregion_format; d3dr->width = r->fmt.i_visible_width; d3dr->height = r->fmt.i_visible_height; hr = IDirect3DDevice9_CreateTexture(sys->d3ddev, d3dr->width, d3dr->height, 1, D3DUSAGE_DYNAMIC, d3dr->format, D3DPOOL_DEFAULT, &d3dr->texture, NULL); if (FAILED(hr)) { d3dr->texture = NULL; msg_Err(vd, "Failed to create %dx%d texture for OSD (hr=0x%0lX)", d3dr->width, d3dr->height, hr); continue; } msg_Dbg(vd, "Created %dx%d texture for OSD", r->fmt.i_visible_width, r->fmt.i_visible_height); } D3DLOCKED_RECT lock; hr = IDirect3DTexture9_LockRect(d3dr->texture, 0, &lock, NULL, 0); if (SUCCEEDED(hr)) { uint8_t *dst_data = lock.pBits; int dst_pitch = lock.Pitch; const int src_offset = r->fmt.i_y_offset * r->p_picture->p->i_pitch + r->fmt.i_x_offset * r->p_picture->p->i_pixel_pitch; uint8_t *src_data = &r->p_picture->p->p_pixels[src_offset]; int src_pitch = r->p_picture->p->i_pitch; for (unsigned y = 0; y < r->fmt.i_visible_height; y++) { int copy_pitch = __MIN(dst_pitch, r->p_picture->p->i_visible_pitch); if (d3dr->format == D3DFMT_A8B8G8R8) { memcpy(&dst_data[y * dst_pitch], &src_data[y * src_pitch], copy_pitch); } else { for (int x = 0; x < copy_pitch; x += 4) { dst_data[y * dst_pitch + x + 0] = src_data[y * src_pitch + x + 2]; dst_data[y * dst_pitch + x + 1] = src_data[y * src_pitch + x + 1]; dst_data[y * dst_pitch + x + 2] = src_data[y * src_pitch + x + 0]; dst_data[y * dst_pitch + x + 3] = src_data[y * src_pitch + x + 3]; } } } hr = IDirect3DTexture9_UnlockRect(d3dr->texture, 0); if (FAILED(hr)) msg_Err(vd, "Failed to unlock the texture"); } else { msg_Err(vd, "Failed to lock the texture"); } /* Map the subpicture to sys->rect_dest */ RECT src; src.left = 0; src.right = src.left + r->fmt.i_visible_width; src.top = 0; src.bottom = src.top + r->fmt.i_visible_height; const RECT video = sys->rect_dest; const float scale_w = (float)(video.right - video.left) / subpicture->i_original_picture_width; const float scale_h = (float)(video.bottom - video.top) / subpicture->i_original_picture_height; RECT dst; dst.left = video.left + scale_w * r->i_x, dst.right = dst.left + scale_w * r->fmt.i_visible_width, dst.top = video.top + scale_h * r->i_y, dst.bottom = dst.top + scale_h * r->fmt.i_visible_height, Direct3DSetupVertices(d3dr->vertex, src, src, dst, subpicture->i_alpha * r->i_alpha / 255); } }
static HRESULT device_create_texture(device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, texture **texture) { IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev; return IDirect3DDevice9_CreateTexture(device, width, height, levels, usage, format, pool, (IDirect3DTexture9 **)texture, NULL); }
static void test_ID3DXSprite(IDirect3DDevice9 *device) { ID3DXSprite *sprite; IDirect3D9 *d3d; IDirect3DDevice9 *cmpdev; IDirect3DTexture9 *tex1, *tex2; D3DXMATRIX mat, cmpmat; D3DVIEWPORT9 vp; RECT rect; D3DXVECTOR3 pos, center; HRESULT hr; IDirect3DDevice9_GetDirect3D(device, &d3d); hr = IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DYNAMIC, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8); IDirect3D9_Release(d3d); ok (hr == D3D_OK, "D3DFMT_A8R8G8B8 not supported\n"); if (FAILED(hr)) return; hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tex1, NULL); ok (hr == D3D_OK, "Failed to create first texture (error code: %#x)\n", hr); if (FAILED(hr)) return; hr = IDirect3DDevice9_CreateTexture(device, 32, 32, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tex2, NULL); ok (hr == D3D_OK, "Failed to create second texture (error code: %#x)\n", hr); if (FAILED(hr)) { IDirect3DTexture9_Release(tex1); return; } /* Test D3DXCreateSprite */ hr = D3DXCreateSprite(device, NULL); ok (hr == D3DERR_INVALIDCALL, "D3DXCreateSprite returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXCreateSprite(NULL, &sprite); ok (hr == D3DERR_INVALIDCALL, "D3DXCreateSprite returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXCreateSprite(device, &sprite); ok (hr == D3D_OK, "D3DXCreateSprite returned %#x, expected %#x\n", hr, D3D_OK); /* Test ID3DXSprite_GetDevice */ hr = ID3DXSprite_GetDevice(sprite, NULL); ok (hr == D3DERR_INVALIDCALL, "GetDevice returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_GetDevice(sprite, &cmpdev); /* cmpdev == NULL */ ok (hr == D3D_OK, "GetDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_GetDevice(sprite, &cmpdev); /* cmpdev != NULL */ ok (hr == D3D_OK, "GetDevice returned %#x, expected %#x\n", hr, D3D_OK); IDirect3DDevice9_Release(device); IDirect3DDevice9_Release(device); /* Test ID3DXSprite_GetTransform */ hr = ID3DXSprite_GetTransform(sprite, NULL); ok (hr == D3DERR_INVALIDCALL, "GetTransform returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_GetTransform(sprite, &mat); ok (hr == D3D_OK, "GetTransform returned %#x, expected %#x\n", hr, D3D_OK); if(SUCCEEDED(hr)) { D3DXMATRIX identity; D3DXMatrixIdentity(&identity); check_mat(mat, identity); } /* Test ID3DXSprite_SetTransform */ /* Set a transform and test if it gets returned correctly */ U(mat).m[0][0]=2.1f; U(mat).m[0][1]=6.5f; U(mat).m[0][2]=-9.6f; U(mat).m[0][3]=1.7f; U(mat).m[1][0]=4.2f; U(mat).m[1][1]=-2.5f; U(mat).m[1][2]=2.1f; U(mat).m[1][3]=5.5f; U(mat).m[2][0]=-2.6f; U(mat).m[2][1]=0.3f; U(mat).m[2][2]=8.6f; U(mat).m[2][3]=8.4f; U(mat).m[3][0]=6.7f; U(mat).m[3][1]=-5.1f; U(mat).m[3][2]=6.1f; U(mat).m[3][3]=2.2f; hr = ID3DXSprite_SetTransform(sprite, NULL); ok (hr == D3DERR_INVALIDCALL, "SetTransform returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_SetTransform(sprite, &mat); ok (hr == D3D_OK, "SetTransform returned %#x, expected %#x\n", hr, D3D_OK); if(SUCCEEDED(hr)) { hr=ID3DXSprite_GetTransform(sprite, &cmpmat); if(SUCCEEDED(hr)) check_mat(cmpmat, mat); else skip("GetTransform returned %#x\n", hr); } /* Test ID3DXSprite_SetWorldViewLH/RH */ todo_wine { hr = ID3DXSprite_SetWorldViewLH(sprite, &mat, &mat); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewLH(sprite, NULL, &mat); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewLH(sprite, &mat, NULL); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewLH(sprite, NULL, NULL); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, &mat, &mat); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, NULL, &mat); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, &mat, NULL); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, NULL, NULL); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); } IDirect3DDevice9_BeginScene(device); /* Test ID3DXSprite_Begin*/ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); IDirect3DDevice9_GetTransform(device, D3DTS_WORLD, &mat); D3DXMatrixIdentity(&cmpmat); check_mat(mat, cmpmat); IDirect3DDevice9_GetTransform(device, D3DTS_VIEW, &mat); check_mat(mat, cmpmat); IDirect3DDevice9_GetTransform(device, D3DTS_PROJECTION, &mat); IDirect3DDevice9_GetViewport(device, &vp); D3DXMatrixOrthoOffCenterLH(&cmpmat, vp.X+0.5f, (float)vp.Width+vp.X+0.5f, (float)vp.Height+vp.Y+0.5f, vp.Y+0.5f, vp.MinZ, vp.MaxZ); check_mat(mat, cmpmat); /* Test ID3DXSprite_Flush and ID3DXSprite_End */ hr = ID3DXSprite_Flush(sprite); ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_End(sprite); ok (hr == D3D_OK, "End returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Flush(sprite); /* May not be called before next Begin */ ok (hr == D3DERR_INVALIDCALL, "Flush returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_End(sprite); ok (hr == D3DERR_INVALIDCALL, "End returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); /* Test ID3DXSprite_Draw */ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); if(FAILED(hr)) skip("Couldn't ID3DXSprite_Begin, can't test ID3DXSprite_Draw\n"); else { /* Feed the sprite batch */ int texref1, texref2; SetRect(&rect, 53, 12, 142, 165); pos.x = 2.2f; pos.y = 4.5f; pos.z = 5.1f; center.x = 11.3f; center.y = 3.4f; center.z = 1.2f; texref1 = get_ref((IUnknown*)tex1); texref2 = get_ref((IUnknown*)tex2); hr = ID3DXSprite_Draw(sprite, NULL, &rect, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3DERR_INVALIDCALL, "Draw returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_Draw(sprite, tex1, &rect, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex2, &rect, ¢er, &pos, D3DCOLOR_XRGB( 3, 45, 66)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, NULL, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, &rect, NULL, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, &rect, ¢er, NULL, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, NULL, NULL, NULL, 0); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); check_ref((IUnknown*)tex1, texref1+5); check_ref((IUnknown*)tex2, texref2+1); hr = ID3DXSprite_Flush(sprite); ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Flush(sprite); /* Flushing twice should work */ ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); check_ref((IUnknown*)tex1, texref1); check_ref((IUnknown*)tex2, texref2); hr = ID3DXSprite_End(sprite); ok (hr == D3D_OK, "End returned %#x, expected %#x\n", hr, D3D_OK); } /* Test ID3DXSprite_OnLostDevice and ID3DXSprite_OnResetDevice */ /* Both can be called twice */ hr = ID3DXSprite_OnLostDevice(sprite); ok (hr == D3D_OK, "OnLostDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnLostDevice(sprite); ok (hr == D3D_OK, "OnLostDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnResetDevice(sprite); ok (hr == D3D_OK, "OnResetDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnResetDevice(sprite); ok (hr == D3D_OK, "OnResetDevice returned %#x, expected %#x\n", hr, D3D_OK); /* Make sure everything works like before */ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex2, &rect, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Flush(sprite); ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_End(sprite); ok (hr == D3D_OK, "End returned %#x, expected %#x\n", hr, D3D_OK); /* OnResetDevice makes the interface "forget" the Begin call */ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnResetDevice(sprite); ok (hr == D3D_OK, "OnResetDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_End(sprite); ok (hr == D3DERR_INVALIDCALL, "End returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); IDirect3DDevice9_EndScene(device); check_release((IUnknown*)sprite, 0); check_release((IUnknown*)tex2, 0); check_release((IUnknown*)tex1, 0); }
CR_API CrBool crTextureCommit(CrTexture* self, const void* data) { CrTextureImpl* impl = (CrTextureImpl*)self; if(nullptr == self) return CrFalse; if(nullptr == impl->apiFormatMapping) return CrFalse; if(self->surfCount == 1) { HRESULT hr; size_t i; IDirect3DTexture9* stageTex; hr = IDirect3DDevice9_CreateTexture(crContextImpl()->d3ddev, self->width, self->height, self->mipCount, 0, impl->apiFormatMapping->d3dFormat, D3DPOOL_SYSTEMMEM, &stageTex, nullptr); if(FAILED(hr)) { crDbgStr("d3d9 failed to create texture %8x", hr); return CrFalse; } for(i=0; i<self->mipCount; ++i) { size_t mipW, mipH; D3DLOCKED_RECT locked; unsigned char* mipdata = crTextureGetMipLevel(self, (unsigned char*)data, 0, i, &mipW, &mipH); hr = IDirect3DTexture9_LockRect(stageTex, i, &locked, nullptr, 0); if(FAILED(hr)) continue; if(CrGpuFormat_UnormR8G8B8A8 != self->format) { memcpy(locked.pBits, mipdata, mipW * mipH * impl->apiFormatMapping->pixelSize); } else { // CrGpuFormat_UnormR8G8B8A8 need to flip the endian since we actually use the OpenGL's layout char* dst = locked.pBits; char* src = mipdata; size_t cnt = mipW * mipH; size_t i; for(i = 0; i<cnt; ++i) { dst[0] = src[2]; dst[1] = src[1]; dst[2] = src[0]; dst[3] = src[3]; dst += 4; src += 4; } } IDirect3DTexture9_UnlockRect(stageTex, i); } IDirect3DDevice9_UpdateTexture(crContextImpl()->d3ddev, (IDirect3DBaseTexture9*)stageTex, (IDirect3DBaseTexture9*)impl->d3dtex); IDirect3DTexture9_Release(stageTex); } return CrTrue; }
static void test_filter(IDirect3DDevice9 *device) { HRESULT hr; IDirect3DTexture9 *texture; IDirect3D9 *d3d9; DWORD passes = 0; unsigned int i; struct filter_tests { DWORD magfilter, minfilter, mipfilter; BOOL has_texture; HRESULT result; } tests[] = { { D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_NONE, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_NONE, D3DTEXF_POINT, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_NONE, FALSE, D3D_OK }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_POINT, FALSE, D3D_OK }, { D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_NONE, TRUE, D3D_OK }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_POINT, TRUE, D3D_OK }, { D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_LINEAR, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_LINEAR, D3DTEXF_POINT, D3DTEXF_NONE, TRUE, E_FAIL }, { D3DTEXF_POINT, D3DTEXF_LINEAR, D3DTEXF_NONE, TRUE, E_FAIL }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_LINEAR, TRUE, E_FAIL }, }; hr = IDirect3DDevice9_GetDirect3D(device, &d3d9); ok(hr == D3D_OK, "IDirect3DDevice9_GetDirect3D(levels = 1) returned %08x\n", hr); hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0, D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F); if(FAILED(hr)) { skip("D3DFMT_A32B32G32R32F not supported\n"); goto out; } hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F); if(SUCCEEDED(hr)) { skip("D3DFMT_A32B32G32R32F supports filtering\n"); goto out; } hr = IDirect3DDevice9_CreateTexture(device, 128, 128, 0, 0, D3DFMT_A32B32G32R32F, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture returned %08x\n", hr); /* Needed for ValidateDevice */ hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1); ok(hr == D3D_OK, "IDirect3DDevice9_SetFVF returned %08x\n", hr); for(i = 0; i < (sizeof(tests) / sizeof(tests[0])); i++) { if(tests[i].has_texture) { hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) texture); ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture returned %08x\n", hr); } else { hr = IDirect3DDevice9_SetTexture(device, 0, NULL); ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture returned %08x\n", hr); } hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, tests[i].magfilter); ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr); hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MINFILTER, tests[i].minfilter); ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr); hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MIPFILTER, tests[i].mipfilter); ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr); passes = 0xdeadbeef; hr = IDirect3DDevice9_ValidateDevice(device, &passes); ok(hr == tests[i].result, "ValidateDevice failed: Texture %s, min %u, mag %u, mip %u. Got %08x, expected %08x\n", tests[i].has_texture ? "TRUE" : "FALSE", tests[i].magfilter, tests[i].minfilter, tests[i].mipfilter, hr, tests[i].result); if(SUCCEEDED(hr)) { ok(passes != 0, "ValidateDevice succeeded, passes is %u\n", passes); } else { ok(passes == 0xdeadbeef, "ValidateDevice failed, passes is %u\n", passes); } } hr = IDirect3DDevice9_SetTexture(device, 0, NULL); ok(SUCCEEDED(hr), "IDirect3DDevice9_SetTexture returned %#x.\n", hr); IDirect3DTexture9_Release(texture); out: IDirect3D9_Release(d3d9); }
/** @brief Create D3D Offscreen and Backbuffer surfaces. Each * surface is created only if it's not already present. * @return 1 on success, 0 on failure */ static int create_d3d_surfaces(void) { int osd_width = vo_dwidth, osd_height = vo_dheight; int tex_width = osd_width, tex_height = osd_height; mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>create_d3d_surfaces called.\n"); if (!priv->d3d_surface && FAILED(IDirect3DDevice9_CreateOffscreenPlainSurface( priv->d3d_device, priv->src_width, priv->src_height, priv->movie_src_fmt, D3DPOOL_DEFAULT, &priv->d3d_surface, NULL))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Allocating offscreen surface failed.\n"); return 0; } if (!priv->d3d_backbuf && FAILED(IDirect3DDevice9_GetBackBuffer(priv->d3d_device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &priv->d3d_backbuf))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Allocating backbuffer failed.\n"); return 0; } /* calculate the best size for the OSD depending on the factors from the device */ if (priv->device_caps_power2_only) { tex_width = 1; tex_height = 1; while (tex_width < osd_width ) tex_width <<= 1; while (tex_height < osd_height) tex_height <<= 1; } if (priv->device_caps_square_only) /* device only supports square textures */ tex_width = tex_height = tex_width > tex_height ? tex_width : tex_height; // better round up to a multiple of 16 tex_width = (tex_width + 15) & ~15; tex_height = (tex_height + 15) & ~15; // make sure we respect the size limits without breaking aspect or pow2-requirements while (tex_width > priv->max_texture_width || tex_height > priv->max_texture_height) { osd_width >>= 1; osd_height >>= 1; tex_width >>= 1; tex_height >>= 1; } priv->osd_width = osd_width; priv->osd_height = osd_height; priv->osd_texture_width = tex_width; priv->osd_texture_height = tex_height; mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>OSD texture size (%dx%d), requested (%dx%d).\n", vo_dwidth, vo_dheight, priv->osd_texture_width, priv->osd_texture_height); /* create OSD */ if (!priv->d3d_texture_system && FAILED(IDirect3DDevice9_CreateTexture(priv->d3d_device, priv->osd_texture_width, priv->osd_texture_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8L8, D3DPOOL_SYSTEMMEM, &priv->d3d_texture_system, NULL))) { mp_msg(MSGT_VO,MSGL_ERR, "<vo_direct3d>Allocating OSD texture in system RAM failed.\n"); return 0; } if (!priv->device_texture_sys) { /* only create if we need a shadow version on the external device */ if (!priv->d3d_texture_osd && FAILED(IDirect3DDevice9_CreateTexture(priv->d3d_device, priv->osd_texture_width, priv->osd_texture_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8L8, D3DPOOL_DEFAULT, &priv->d3d_texture_osd, NULL))) { mp_msg(MSGT_VO,MSGL_ERR, "<vo_direct3d>Allocating OSD texture in video RAM failed.\n"); return 0; } } /* setup default renderstate */ IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_SRCBLEND, D3DBLEND_ONE); IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHAFUNC, D3DCMP_GREATER); IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHAREF, (DWORD)0x0); IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_LIGHTING, FALSE); IDirect3DDevice9_SetSamplerState(priv->d3d_device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); IDirect3DDevice9_SetSamplerState(priv->d3d_device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); return 1; }
CR_API CrBool crTextureInitRtt(CrTexture* self, size_t width, size_t height, size_t mipCount, size_t surfCount, CrGpuFormat format) { CrTextureImpl* impl = (CrTextureImpl*)self; if(self->flags & CrTexture_Inited) { crDbgStr("texture already inited!\n"); return CrFalse; } if(surfCount > 1) { crDbgStr("Current not support surfCount > 1!\n"); return CrFalse; } impl->apiFormatMapping = crTextureGpuFormatMappingGet(format); if(nullptr == impl->apiFormatMapping) { crDbgStr("Non supported texture format: %s\n", format); return CrFalse; } self->format = format; self->width = width; self->height = height; self->mipCount = mipCount; self->surfCount = surfCount; // calculate single surface size { size_t tmpw, tmph; self->surfSizeInByte = crTextureGetMipLevelOffset(self, self->mipCount+1, &tmpw, &tmph); } /* // create d3d texture { HRESULT hr; hr = IDirect3DDevice9_CreateTexture(crContextImpl()->d3ddev, width, height, self->mipCount, D3DUSAGE_RENDERTARGET, impl->apiFormatMapping->d3dFormat, D3DPOOL_DEFAULT, &impl->d3dtex, nullptr); if(FAILED(hr)) { crDbgStr("d3d9 failed to create texture %8x", hr); return CrFalse; } } */ // depth texture is not support in d3d9 if(format & CrGpuFormat_Depth) { HRESULT hr = IDirect3DDevice9_CreateDepthStencilSurface( crContextImpl()->d3ddev, width, height, impl->apiFormatMapping->d3dFormat, D3DMULTISAMPLE_NONE, 0, TRUE, &impl->d3dsurf, nullptr); if(FAILED(hr)) { crDbgStr("d3d9 failed to create texture %8x", hr); return CrFalse; } } else { HRESULT hr; hr = IDirect3DDevice9_CreateTexture(crContextImpl()->d3ddev, width, height, self->mipCount, D3DUSAGE_RENDERTARGET, impl->apiFormatMapping->d3dFormat, D3DPOOL_DEFAULT, &impl->d3dtex, nullptr); if(FAILED(hr)) { crDbgStr("d3d9 failed to create texture %8x", hr); return CrFalse; } hr = IDirect3DTexture9_GetSurfaceLevel(impl->d3dtex, 0, &impl->d3dsurf); if(FAILED(hr)) { crDbgStr("d3d9 failed to get texture surface %8x", hr); return CrFalse; } } self->flags = CrTexture_Inited | CrTexture_RenderTarget; return CrTrue; }