bool Blit::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest) { IDirect3DTexture9 *texture = copySurfaceToTexture(source, getSurfaceRect(source)); if (!texture) { return false; } IDirect3DDevice9 *device = getDevice(); saveState(); device->SetTexture(0, texture); device->SetRenderTarget(0, dest); setVertexShader(SHADER_VS_STANDARD); setPixelShader(SHADER_PS_PASSTHROUGH); setCommonBlitState(); device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); setViewport(getSurfaceRect(dest), 0, 0); render(); texture->Release(); restoreState(); return true; }
gl::Error Blit9::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest) { IDirect3DTexture9 *texture = NULL; gl::Error error = copySurfaceToTexture(source, getSurfaceRect(source), &texture); if (error.isError()) { return error; } IDirect3DDevice9 *device = mRenderer->getDevice(); saveState(); device->SetTexture(0, texture); device->SetRenderTarget(0, dest); setVertexShader(SHADER_VS_STANDARD); setPixelShader(SHADER_PS_PASSTHROUGH); setCommonBlitState(); device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); setViewport(getSurfaceRect(dest), 0, 0); render(); SafeRelease(texture); restoreState(); return gl::Error(GL_NO_ERROR); }
bool Blit::setFormatConvertShaders(GLenum destFormat) { bool okay = setVertexShader(SHADER_VS_STANDARD); switch (destFormat) { default: UNREACHABLE(); case GL_RGBA: case GL_BGRA_EXT: case GL_RGB: case GL_ALPHA: okay = okay && setPixelShader(SHADER_PS_COMPONENTMASK); break; case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: okay = okay && setPixelShader(SHADER_PS_LUMINANCE); break; } if (!okay) { return false; } enum { X = 0, Y = 1, Z = 2, W = 3 }; // The meaning of this constant depends on the shader that was selected. // See the shader assembly code above for details. float psConst0[4] = { 0, 0, 0, 0 }; switch (destFormat) { default: UNREACHABLE(); case GL_RGBA: case GL_BGRA_EXT: psConst0[X] = 1; psConst0[Z] = 1; break; case GL_RGB: psConst0[X] = 1; psConst0[W] = 1; break; case GL_ALPHA: psConst0[Z] = 1; break; case GL_LUMINANCE: psConst0[Y] = 1; break; case GL_LUMINANCE_ALPHA: psConst0[X] = 1; break; } getDevice()->SetPixelShaderConstantF(0, psConst0, 1); return true; }
gl::Error Blit9::setFormatConvertShaders(GLenum destFormat) { gl::Error error = setVertexShader(SHADER_VS_STANDARD); if (error.isError()) { return error; } switch (destFormat) { default: UNREACHABLE(); case GL_RGBA: case GL_BGRA_EXT: case GL_RGB: case GL_RG_EXT: case GL_RED_EXT: case GL_ALPHA: error = setPixelShader(SHADER_PS_COMPONENTMASK); break; case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: error = setPixelShader(SHADER_PS_LUMINANCE); break; } if (error.isError()) { return error; } enum { X = 0, Y = 1, Z = 2, W = 3 }; // The meaning of this constant depends on the shader that was selected. // See the shader assembly code above for details. // Allocate one array for both registers and split it into two float4's. float psConst[8] = { 0 }; float *multConst = &psConst[0]; float *addConst = &psConst[4]; switch (destFormat) { default: UNREACHABLE(); case GL_RGBA: case GL_BGRA_EXT: multConst[X] = 1; multConst[Y] = 1; multConst[Z] = 1; multConst[W] = 1; addConst[X] = 0; addConst[Y] = 0; addConst[Z] = 0; addConst[W] = 0; break; case GL_RGB: multConst[X] = 1; multConst[Y] = 1; multConst[Z] = 1; multConst[W] = 0; addConst[X] = 0; addConst[Y] = 0; addConst[Z] = 0; addConst[W] = 1; break; case GL_RG_EXT: multConst[X] = 1; multConst[Y] = 1; multConst[Z] = 0; multConst[W] = 0; addConst[X] = 0; addConst[Y] = 0; addConst[Z] = 0; addConst[W] = 1; break; case GL_RED_EXT: multConst[X] = 1; multConst[Y] = 0; multConst[Z] = 0; multConst[W] = 0; addConst[X] = 0; addConst[Y] = 0; addConst[Z] = 0; addConst[W] = 1; break; case GL_ALPHA: multConst[X] = 0; multConst[Y] = 0; multConst[Z] = 0; multConst[W] = 1; addConst[X] = 0; addConst[Y] = 0; addConst[Z] = 0; addConst[W] = 0; break; case GL_LUMINANCE: multConst[X] = 1; multConst[Y] = 0; multConst[Z] = 0; multConst[W] = 0; addConst[X] = 0; addConst[Y] = 0; addConst[Z] = 0; addConst[W] = 1; break; case GL_LUMINANCE_ALPHA: multConst[X] = 1; multConst[Y] = 0; multConst[Z] = 0; multConst[W] = 1; addConst[X] = 0; addConst[Y] = 0; addConst[Z] = 0; addConst[W] = 0; break; } mRenderer->getDevice()->SetPixelShaderConstantF(0, psConst, 2); return gl::Error(GL_NO_ERROR); }