Opened 3 months ago

Closed 2 months ago

#11078 closed defect (fixed)

Blade Runner: OpenGL graphics mode produces white screen

Reported by: raziel- Owned by: peterkohaut
Priority: normal Component: Engine: Bladerunner
Keywords: Cc: ccawley2011
Game: Blade Runner

Description

ScummVM 2.1.0git (Aug 13 2019 10:45:13)
Features compiled in: TAINTED Vorbis FLAC MP3 RGB zLib MPEG2 Theora AAC A/52 FreeType2 JPEG PNG cloud (servers, local)

e86ee33999f33ad66bb7c018b4d4b7604b48badb

Regression.
With above commit the OpenGL graphics mode stopped working and only produces a complete white screen/window during the whole game (intro video and gameplay).
Reverting this, makes OpenGL graphics mode work perfectly again on AmigaOS4.

Blade Runner (Windows/English)

AmigaOS4 - SDL - BE - PPC
gcc (adtools build 8.3.0) 8.3.0

Change History (32)

comment:1 by peterkohaut, 3 months ago

In that commit output format was changed from 15bit rgb555 to 16bit argb1555, because android port supports only that, that might be the issue.
Please, as i dont have access to amiga with opengl can you try to change line https://github.com/scummvm/scummvm/commit/e86ee33999f33ad66bb7c018b4d4b7604b48badb#diff-f199a055d38e2201e8a040ed1e912a2eR317 from return Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0); to return Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);

comment:2 by raziel-, 3 months ago

Thank you.

Will test when I get back home (next Monday)

comment:3 by raziel-, 3 months ago

@peterkohaut

Is there a way I can debug/show the pixel format before it is sent and used?
We suspect a faulty input into the pixel format which causes the white.

comment:4 by peterkohaut, 3 months ago

Faulty input will show in other ports as well, no? For example, there were few rendering artifacts & issues with android port and when opengl was enabled on windows with wrong alpha was used (game has alpha switched 0<->1)

Last edited 3 months ago by peterkohaut (previous) (diff)

comment:5 by raziel-, 3 months ago

It will, yes, IF all platforms work on the same SDL version.
Since amigaos4's SDL is still being developed/ported there might be a slim chance that it causes such issues (on amigaos4).

comment:6 by peterkohaut, 3 months ago

maybe i just don't understand what are you asking, graphics is initialized here: https://github.com/scummvm/scummvm/blob/master/engines/bladerunner/bladerunner.cpp#L328 but conversion from internal game format to one used it done in multiple places

comment:7 by raziel-, 3 months ago

First of all, I'm not trying to diss your code or workaround.
If I gave that impression in one of my earlier posts I do apologise.

I'm merely trying to rule out a bug in my platforms SDL/OpenGL implementation, because the last eight issues I had with sdl apps (ScummVM and ResidualVM being amongst them) were actually down to bugs or missing features in my platforms SDL/OpenGL implementation.

But for that I'd need to get a reproducable result to send to the devs.

That's why I'm trying to understand the PixelFormat numbers and where they come from.
Maybe, since it seems that AmigaOS4 is the only target that still don't work, there is a PixelFormat that is simply not supported (yet) or produces said white screen.

If I'm able to pinpoint the PixelFormat that produces that white screen I might be able to give a reproducable case and finally help fix a potential bug.

Sorry to be such a pain.

comment:8 by ccawley2011, 3 months ago

If it helps, ScummVM pixel formats are mapped to OpenGL pixel formats here: https://github.com/scummvm/scummvm/blob/master/backends/graphics/opengl/opengl-graphics.cpp#L1109

The values returned there are the ones used by glTexImage2D, as documented here: https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml

comment:9 by peterkohaut, 3 months ago

No worries:) I saw nothing like that... I'm just confused as I don't know exactly know what are you asking and I dont know that much about opengl backend in scummvm.
I know the bigger change I made that might broke your output is that pixel format change, if you have chance to try the older one.

comment:10 by raziel-, 3 months ago

@ccawley2011

I'll check it out.

Thank you

comment:11 by raziel-, 3 months ago

I'll test once I get home.

I got more (unplanned) days to work, so it will delay testing until after Saturday.

Sorry

comment:12 by raziel-, 3 months ago

Using
return Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
I get an error window (from ScummVM) telling me
Could not initialise color format.

If i click that window away the game plays in the background, but this time with a black screen

Last edited 3 months ago by raziel- (previous) (diff)

comment:13 by raziel-, 3 months ago

I get a lot of GLErrors, not sure if it helps though

User picked target 'bladerunner-final-win' (gameid 'bladerunner-final')... 
  Looking for a plugin supporting this gameid... Blade Runner 
  Starting 'Blade Runner with restored content' 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexImage2D(0x0DE1, 0, _glIntFormat, _width, _height, 0, _glFormat, _glType, __null) (backends/graphics/opengl/texture.cpp:141)! 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
Subtitles version info: v3 (09:35:49 22/07/2019) EFIGS by: English by ScummVM Team, French by Kwama57 
Subtitles font 'SUBTLS_E.FON' was loaded successfully. 
SliceAnimations::openFrames: HDFRAMES.DAT resource not found. Falling back to using CDFRAMESx.DAT files instead... 
WARNING: numQueuedStreams: 0! 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: numQueuedStreams: 0! 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: numQueuedStreams: 0! 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: numQueuedStreams: 0! 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: numQueuedStreams: 0! 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: numQueuedStreams: 0! 
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
    Blade Runner 
     
    From the dark recesses of David Leary's imagination comes a game unlike any 
    other. Blade Runner immerses you in the underbelly of future Los Angeles. Right 
    from the start, the story pulls you in with graphic descriptions of a 
    grandmother doing the shimmy in her underwear, child molestation, brutal 
    cold-blooded slaying of innocent animals, vomiting on desks, staring at a 
    woman's ass, the list goes on. And when the game starts, the real fun begins - 
    shoot down-on-their-luck homeless people and toss them into a dumpster. Watch 
    with sadistic glee as a dog gets blown into chunky, bloody, bits by an 
    explosive, and even murder a shy little girl who loves you. If you think David 
    Leary is sick, and you like sick, this is THE game for you. 
     
    JW: Don't forget the wasting of helpless mutated cripples in the underground. 
    It's such a beautiful thing! 
     
    DL: Go ahead.  Just keep beating that snarling pit bull...ignore the foam 
    around his jaws. There's room on the top shelf of my fridge for at least one 
    more head... - Psychotic Dave 
     
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!
    MG: Is David Leary a self-respecting human or is he powered by rechargeable 
    batteries? 

WARNING: GL ERROR: GL_INVALID_OPERATION on glTexSubImage2D(0x0DE1, 0, 0, area.top, src.w, area.height(), _glFormat, _glType, src.getBasePtr(0, area.top)) (backends/graphics/opengl/texture.cpp:169)!

comment:14 by raziel-, 3 months ago

@peterkohaut

With the help of the SDL devs i added some debug output and it seems we have cornered the problem

User picked target 'bladerunner-final-win' (gameid 'bladerunner-final')... 
  Looking for a plugin supporting this gameid... Blade Runner 
  Starting 'Blade Runner with restored content' 
glintFormat 6408, glFormat 6408, glType 5121, width 32, height 32 
glintFormat 6408, glFormat 6408, glType 32820, width 1024, height 512

The problem might be the type
32820 (0x8034): #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034

There is no "unpacker" in our MiniGL for this type, see
http://www.hyperion-entertainment.com/svn/MiniGL/branches/updates-kc/src/unpack.c
for supported unpackers.

Since i don't know if this type will get supported anytime soon, and since it worked before, would there be a workaround in ScummVM possible for the time being?

comment:15 by ccawley2011, 3 months ago

Cc: ccawley2011 added
Owner: set to ccawley2011
Resolution: fixed
Status: newpending

This should hopefully be fixed by https://github.com/scummvm/scummvm/pull/1825

comment:16 by raziel-, 3 months ago

Unfortunately not :-(

I get the same unsupported PixelFormat

User picked target 'bladerunner-final-win' (gameid 'bladerunner-final')...
  Looking for a plugin supporting this gameid... Blade Runner
  Starting 'Blade Runner with restored content'
glintFormat 6408, glFormat 6408, glType 5121, width 32, height 32
glintFormat 6408, glFormat 6408, glType 32820, width 1024, height 512

which is still producing a white screen.

btw: The debug line i added is

debug("glintFormat %d, glFormat %d, glType %d, width %d, height %d", _glIntFormat, _glFormat, _glType, _width, _height);

https://github.com/scummvm/scummvm/blob/master/backends/graphics/opengl/texture.cpp#L140

Last edited 3 months ago by raziel- (previous) (diff)

comment:17 by raziel-, 3 months ago

@ccawley2011

Nevermind my previous post.

I had a slow moment and was fooled by the fact there was another bladerunner change recently,
which made me believe it would be sufficent to pull the latest sources.

I built your tree from the PR now, tested and confirmed working.

This is the output:

User picked target 'bladerunner-final-win' (gameid 'bladerunner-final')...
  Looking for a plugin supporting this gameid... Blade Runner
  Starting 'Blade Runner with restored content'
Using pixel format: RGB565@2

Thank you very much

comment:18 by peterkohaut, 3 months ago

please, can you try it with https://github.com/scummvm/scummvm/commit/a7399c5111cc7ebeea284498a1ee5ac7542bb96d ?
that one extends the engine to use the best pixel format on platform (32 bit formats are now supported)

comment:19 by raziel-, 3 months ago

Will do asap (not before upcoming weekend, though)

Thank you

comment:20 by peterkohaut, 3 months ago

Component: GraphicsEngine: Bladerunner

comment:21 by criezy, 3 months ago

Summary: WME: Blade Runner - OpenGL graphics mode produces white screenBlade Runner: OpenGL graphics mode produces white screen

comment:22 by raziel-, 3 months ago

@peterkohaut

Confirmed fixed with https://github.com/scummvm/scummvm/commit/a7399c5111cc7ebeea284498a1ee5ac7542bb96d

User picked target 'bladerunner-final-win' (gameid 'bladerunner-final')...
  Looking for a plugin supporting this gameid... Blade Runner
  Starting 'Blade Runner with restored content'
Using pixel format: RGBA8888@4

But this one is slow, the intro is reduced to a (fast) dia-show, skippy animation and pauses when a new animated object is drawn (i.e. the different cursors in the first scene).

The earlier fix in https://github.com/scummvm/scummvm/pull/1825 was perfect (in regards to game speed)

comment:23 by peterkohaut, 2 months ago

Later I've noticed that I introduced some regression in performance with it. I tried to mitigate it with https://github.com/scummvm/scummvm/commit/4355c42044493249cfc2562e190e66f7226a4829
can you try with that one and compile with compiler optimizations enabled?

The 1825 was not good enough for ps3 port as it doesn't like 16bit formats.

comment:24 by raziel-, 2 months ago

@peterkohaut

Confirmed fixed with 4355c.

Without optimizations the speech in videos is out-of-sync and i get slowdowns, mostly just before scene changes.

With optimizations enabled everything seems fine (at least in videos), have to test more, but that would not be part of this issue report :-)

Thank you very much

comment:25 by mim2011, 2 months ago

@peterkohaut
with the commit https://github.com/scummvm/scummvm/commit/a7399c5111cc7ebeea284498a1ee5ac7542bb96d it is broken for older Android (4.2.2) with the AndroidSDL port.

09-11 14:07:10.171 25530-25548/? E/libSDL: ERROR: Setting the swap interval is not supported
09-11 14:07:10.171 25530-25548/? E/libSDL: ERROR: Getting the swap interval is not supported
09-11 14:07:10.171 25530-25548/? E/libSDL: ERROR: GL_GetAttribute not supported
09-11 14:07:16.287 25530-25548/? A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 25548 (GLThread)
09-11 14:07:17.334 445-496/? E/InputDispatcher: channel '420d2c08 org.scummvm.scummvm/org.scummvm.scummvm.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

comment:26 by raziel-, 2 months ago

@mim2011

What about the followup 4355c?
That is the commit that is/will be used finally.

comment:27 by mim2011, 2 months ago

@raziel

I build it again today with the last code stand and I see no change. When I try to launch Blade Runner it exits Scummvm:

09-13 12:28:35.911 9508-9508/? E/dalvikvm: Could not find class 'com.google.common.flogger.backend.google.GooglePlatform', referenced from method via.c
09-13 12:28:36.750 9508-9527/? E/dalvikvm: Could not find class 'android.app.AppOpsManager', referenced from method px.a
09-13 12:28:37.087 9508-9508/? E/dalvikvm: Could not find class 'android.view.animation.PathInterpolator', referenced from method qw.a
09-13 12:28:37.207 9484-9523/? A/libc: Fatal signal 11 (SIGSEGV) at 0x5494b000 (code=1), thread 9523 (com.asus.reader)
09-13 12:28:38.562 9537-9537/? E/cutils: to chown(/mnt/shell/emulated/0, 0, 0)
09-13 12:28:38.562 9537-9537/? E/cutils: to chown(/mnt/shell/emulated/obb, 0, 0)
09-13 12:28:38.563 9537-9537/? E/cutils: to chown(/storage/emulated/0/Android, 0, 0)
09-13 12:28:38.563 9537-9537/? E/cutils: to chown(/storage/emulated/0/Android/obb, 0, 0)
09-13 12:28:39.150 9254-9315/? A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 9315 (GLThread)
09-13 12:28:41.414 445-496/? E/InputDispatcher: channel '4145ae30 org.scummvm.scummvm/org.scummvm.scummvm.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
09-13 12:28:41.784 9537-9537/? E/dalvikvm: Could not find class 'android.content.pm.ShortcutManager', referenced from method com.google.android.apps.gsa.binaries.devore.app.c.hy
09-13 12:28:42.167 9558-9558/? E/cutils: to chown(/mnt/shell/emulated/0, 0, 0)

I think that it is about a commit an the same day like a7399c5111cc7ebeea284498a1ee5ac7542bb96d, I tried to revert it and it is still broken. But the code from 29.08 it is ok.

comment:28 by raziel-, 2 months ago

@mim2011

I meant the branch with said fixes 4355c (see above for thr link).
I'm not sure that the fix has made it into the main tree, yet.

comment:29 by mim2011, 2 months ago

@raziel

I see no branch for these fixes, but the commit 4355c is in master and it brings no solution. I tried also on a Android 5.1 and it is the same, when starting Blade Runner it exits the app.

comment:30 by raziel-, 2 months ago

@mim2011

Ah, ok, I'm not on my setup and cant really check that very well.

I don't know if this (closed) item is still monitored by the devs, so you may want to address your issue here aswell: https://forums.scummvm.org/viewtopic.php?f=1&t=14900&p=87655#p87655

comment:31 by antoniou79, 2 months ago

@mim2011 I am afraid I can't reproduce your issue.

I have tried on an Android 4.4.4 phone and an Android 5.1 with a fresh local build of the Android SDL port. Both were able to launch Blade Runner without issues -- intro cutscenes, gameplay, subtitles, the works.
This is with the default graphic settings, btw.

comment:32 by antoniou79, 2 months ago

Owner: changed from ccawley2011 to peterkohaut
Status: pendingclosed

I am marking this ticket as resolved.
@mim2011 if your issue persists, and since it seems to be an entirely different one, please open a new ticket for it.

Note: See TracTickets for help on using tickets.