[D3D] Added native and emulated S3TC support
Christian Costa
titan.costa at wanadoo.fr
Thu Jul 29 16:21:22 CDT 2004
Lionel Ulmer wrote:
>I have just a few comments on the patch (yeah, it would not have been fun if
>I had commented on wine-d3d first :-) ).
>
:-)
>
>But anyway, great work !
>
>
>
>>+static BOOL DDRAW_bind_to_s3tc( void )
>>+{
>>+ const char *s3tcname = SONAME_LIBS3TC;
>>+
>>+ s3tc_handle = wine_dlopen(s3tcname, RTLD_NOW, NULL, 0);
>>+ if (!s3tc_handle) {
>>+ printf("Wine cannot find the S3TC software decompression library (%s).\n",s3tcname);
>>
>>
>
>Why did you use 'printf' here instead of WARN or ERR ?
>
>Moreover, with this, we will print an error at DirectX loading when the
>users do not have this library installed ... even if the game does never
>request any compressed mode textures.
>
>
Ooop... Forgot to clean-up these printf.
>Would it not be better to somehow print the error message when the
>application wants to create a DXTN texture (ie somehow remember that we do
>not support this feature and keep the error message for later).
>
>
Good idea. I will see...
>
>
>>+ return FALSE;
>>+ }
>>+
>>+#define API_FUNCTION(f) \
>>+ if((f = wine_dlsym(s3tc_handle, #f, NULL, 0)) == NULL) \
>>+ { \
>>+ printf("Can't find symbol %s\n", #f); \
>>
>>
>
>Same printf comment here (but this one can be kept here :-) ).
>
Same as above.
>
>
>
>>+ goto sym_not_found; \
>>+ }
>>+ API_FUNCTION(fetch_2d_texel_rgba_dxt1);
>>+ API_FUNCTION(fetch_2d_texel_rgba_dxt3);
>>+ API_FUNCTION(fetch_2d_texel_rgba_dxt5);
>>+#undef API_FUNCTION
>>+
>>+ return TRUE;
>>+
>>+sym_not_found:
>>+ WARN("Wine cannot find functions that are necessary for S3TC decompression\n");
>>+ wine_dlclose(s3tc_handle, NULL, 0);
>>+ s3tc_handle = NULL;
>>+ return FALSE;
>>+}
>>+
>>
>>
>
>(...)
>
>
>>
>>+ if (src_pf->dwFlags & DDPF_FOURCC) {
>>+ GLenum retVal;
>>+ int size = surf_ptr->surface_desc.u1.dwLinearSize;
>>+ int width = surf_ptr->surface_desc.dwWidth;
>>+ int height = surf_ptr->surface_desc.dwHeight;
>>+ LPVOID buffer = surf_ptr->surface_desc.lpSurface;
>>+
>>+ switch (src_pf->dwFourCC) {
>>+ case MAKE_FOURCC('D','X','T','1'): retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
>>+ case MAKE_FOURCC('D','X','T','3'): retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
>>+ case MAKE_FOURCC('D','X','T','5'): retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
>>+ default:
>>+ FIXME("FourCC Not supported\n");
>>+ return DD_OK;
>>+ break;
>>+ }
>>+ GL_extensions.glCompressedTexImage2D(GL_TEXTURE_2D, current_level, retVal, width, height, 0, size, buffer);
>>
>>
>
>How are we sure that this code will never be called with the
>'glCompressedTexImage2D' unset ? I.e. when we are in emulation mode, what
>happens here ?
>
Humm... You're right. If the app does not check if the device supports
theses texture formats, this may happen.
>
>Is this because when we are in emulation mode, we do not advertise support
>for DTXN textures, this means that the application can create such textures,
>but will be automagically converted to RGB ones at Loading ?
>
If the device does not support these textures formats you can still
create such textures.
You need to blit from a S3TC texture to a RBG one to do the
decompression and use the latter with the device.
>
>Anyway, I would still prefer a test here to prevent crashes for application
>which do not behave well :-)
>
OK.
>
>(...)
>
>
>>+ if (current_surface->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC) {
>>+ GLint retVal;
>>+ int size = current_surface->surface_desc.u1.dwLinearSize;
>>+ int width_ = current_surface->surface_desc.dwWidth;
>>+ int height_ = current_surface->surface_desc.dwHeight;
>>+ LPVOID buffer = current_surface->surface_desc.lpSurface;
>>+
>>+ switch (current_surface->surface_desc.u4.ddpfPixelFormat.dwFourCC) {
>>+ case MAKE_FOURCC('D','X','T','1'): retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
>>+ case MAKE_FOURCC('D','X','T','3'): retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
>>+ case MAKE_FOURCC('D','X','T','5'): retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
>>+ default:
>>+ FIXME("Not supported\n");
>>+ return DD_OK;
>>+ break;
>>+ }
>>+ /* GL_extensions.glCompressedTexSubImage2D(GL_TEXTURE_2D, current_level, xoffset, yoffset, width, height, retVal, (unsigned char*)temp_buffer); */
>>+ GL_extensions.glCompressedTexImage2D(GL_TEXTURE_2D, current_level, retVal, width_, height_, 0, size, buffer);
>>
>>
>
>Same here.
>
>
>
>>+ }
>>+
>>+ if (strstr(glExtensions, "GL_EXT_texture_compression_s3tc")) {
>>+ TRACE(" - S3TC compression supported\n");
>>+ GL_extensions.s3tc_compressed_texture = TRUE;
>>+ GL_extensions.glCompressedTexImage2D = pglXGetProcAddressARB("glCompressedTexImage2D");
>>+ GL_extensions.glCompressedTexSubImage2D = pglXGetProcAddressARB("glCompressedTexSubImage2D");
>> }
>>
>>
>
>If I were pedantic, you should test for 'GL_ARB_texture_compression' to be
>able to get the 'glCompressedTexImage2DARB' and
>'glCompressedTexSubImage2DARB' functions (which may be better than using the
>non-ARB versions which are, AFAIK, the ones in GL 1.4).
>
>And then to get 'GL_EXT_texture_compression_s3tc' to set
>'GL_extensions.s3tc_compressed_texture' to TRUE.
>
>But as 'GL_EXT_texture_compression_s3tc' depends on
>'GL_ARB_texture_compression', I will let you do this shortcut :-)
>
:-)
>
>
>
>>- /* We do not support for now compressed texture formats... */
>>- if (ddsd.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC)
>>+ /* We support for now only DXT1, DXT3 & DXT5 compressed texture formats... */
>>+ if ((ddsd.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC) &&
>>+ (ddsd.u4.ddpfPixelFormat.dwFourCC != MAKE_FOURCC('D','X','T','1')) &&
>>+ (ddsd.u4.ddpfPixelFormat.dwFourCC != MAKE_FOURCC('D','X','T','3')) &&
>>+ (ddsd.u4.ddpfPixelFormat.dwFourCC != MAKE_FOURCC('D','X','T','5')) )
>> {
>> return DDERR_INVALIDPIXELFORMAT;
>> }
>>
>>
>
>What to do here when neither hardware nor emulated support is present ?
>Maybe we should print an error (cf previous comment) and return
>INVALIDPIXELFORMAT, no ?
>
Yes, we must check if there is any S3TC support otherwise we must return
an error.
>
> Lionel (who goes testing NOFL :-) )
>
>
>
Thanks for the comments.
Bye,
Christian
More information about the wine-devel
mailing list