<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[Bug] [A5.1] Allegro crashes in fullscreen mode (rel. al_init_ttf_addon)</title>
		<link>http://www.allegro.cc/forums/view/613021</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 25 Jul 2013 11:02:55 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I saw this reported already, but details were sketchy. </p><p>Allegro crashes sometimes under Windows when using DirectX render in full-screen mode with non-desktop resolution. Crash seems to be related to TTF addon. Here&#39;s my reproduction code:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>  <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span>
<span class="number">  3</span>  <a href="http://www.allegro.cc/manual/al_set_new_bitmap_flags"><span class="a">al_set_new_bitmap_flags</span></a><span class="k2">(</span> ALLEGRO_MIN_LINEAR <span class="k3">|</span> ALLEGRO_MAG_LINEAR <span class="k3">|</span> ALLEGRO_MIPMAP <span class="k3">|</span> ALLEGRO_VIDEO_BITMAP <span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span> ALLEGRO_FULLSCREEN<span class="k3">|</span>ALLEGRO_DIRECT3D <span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span> ALLEGRO_VSYNC, <span class="n">1</span>, ALLEGRO_SUGGEST <span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span> ALLEGRO_COLOR_SIZE, <span class="n">32</span>, ALLEGRO_REQUIRE <span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>d <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">1024</span>, <span class="n">768</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>        <span class="k1">if</span> <span class="k2">(</span> <span class="k3">!</span>d <span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>  <a href="http://www.allegro.cc/manual/al_init_image_addon"><span class="a">al_init_image_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>  <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  
<span class="number"> 14</span>  <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>b <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span> <span class="s">"../Data/Sprites/defence_arrows.png"</span> <span class="k2">)</span><span class="k2">;</span>  
<span class="number"> 17</span>
<span class="number"> 18</span>  <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span> b <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span> d <span class="k2">)</span><span class="k2">;</span>
</div></div><p>

Allegro (or rather DirectX) will crash in call from al_load_bitmap to here:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">static</span> <span class="k1">void</span> d3d_do_upload<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> width,
<span class="number">  2</span>   <span class="k1">int</span> height, <span class="k1">bool</span> sync_from_memory<span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>   ALLEGRO_BITMAP_EXTRA_D3D <span class="k3">*</span>d3d_bmp <span class="k3">=</span> get_extra<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>   <span class="k1">if</span> <span class="k2">(</span>sync_from_memory<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  7</span>      d3d_sync_bitmap_texture<span class="k2">(</span>bmp, x, y, width, height<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>   <span class="k2">}</span>
<span class="number">  9</span>
<span class="number"> 10</span>   <span class="k1">if</span> <span class="k2">(</span>_al_d3d_render_to_texture_supported<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 11</span>      <span class="k1">if</span> <span class="k2">(</span>d3d_bmp-&gt;display-&gt;device-&gt;UpdateTexture<span class="k2">(</span>
<span class="number"> 12</span>            <span class="k2">(</span>IDirect3DBaseTexture9 <span class="k3">*</span><span class="k2">)</span>d3d_bmp-&gt;system_texture,
<span class="number"> 13</span>            <span class="k2">(</span>IDirect3DBaseTexture9 <span class="k3">*</span><span class="k2">)</span>d3d_bmp-&gt;video_texture<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> D3D_OK<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>         ALLEGRO_ERROR<span class="k2">(</span><span class="s">"d3d_do_upload: Couldn't update texture.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>         <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 16</span>      <span class="k2">}</span>
<span class="number"> 17</span>   <span class="k2">}</span>
<span class="number"> 18</span><span class="k2">}</span>
</div></div><p>

...on call to d3d_bmp-&gt;display-&gt;device-&gt;UpdateTexture on attempt to access invalid pointer. Bot input pointers seem to be valid at the first glance, so something deeper is corrupted.</p><p>However, this will not happen, if I initialize ttf addon BEFORE creating display:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>  <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span>
<span class="number">  3</span>  <a href="http://www.allegro.cc/manual/al_set_new_bitmap_flags"><span class="a">al_set_new_bitmap_flags</span></a><span class="k2">(</span> ALLEGRO_MIN_LINEAR <span class="k3">|</span> ALLEGRO_MAG_LINEAR <span class="k3">|</span> ALLEGRO_MIPMAP <span class="k3">|</span> ALLEGRO_VIDEO_BITMAP <span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span> ALLEGRO_FULLSCREEN<span class="k3">|</span>ALLEGRO_DIRECT3D <span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span> ALLEGRO_VSYNC, <span class="n">1</span>, ALLEGRO_SUGGEST <span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span> ALLEGRO_COLOR_SIZE, <span class="n">32</span>, ALLEGRO_REQUIRE <span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  <a href="http://www.allegro.cc/manual/al_init_image_addon"><span class="a">al_init_image_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>  <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  
<span class="number"> 11</span>  <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>d <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">1024</span>, <span class="n">768</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>        <span class="k1">if</span> <span class="k2">(</span> <span class="k3">!</span>d <span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>b <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span> <span class="s">"../Data/Sprites/defence_arrows.png"</span> <span class="k2">)</span><span class="k2">;</span>  
<span class="number"> 17</span>
<span class="number"> 18</span>  <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span> b <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span> d <span class="k2">)</span><span class="k2">;</span>
</div></div><p>

This way, it always works. However, I could find no mention of this in docs, and also this does not happen if I either:
</p><ul><li><p>Use OpenGL or
</p></li><li><p>Use windowed mode or
</p></li><li><p>Use fullscreen mode with desktop resolution (1920x1080 for me)</p></li></ul><p>So I think it&#39;s a bug.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Max Savenkov)</author>
		<pubDate>Wed, 24 Jul 2013 12:17:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is al_init_ttf_addon, so to me it looks like something in Freetype itself:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">bool</span> <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   <span class="k1">if</span> <span class="k2">(</span>ttf_inited<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  4</span>      ALLEGRO_WARN<span class="k2">(</span><span class="s">"TTF addon already initialised.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>      <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  6</span>   <span class="k2">}</span>
<span class="number">  7</span>
<span class="number">  8</span>   FT_Init_FreeType<span class="k2">(</span><span class="k3">&amp;</span>ft<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>   vt.font_height <span class="k3">=</span> ttf_font_height<span class="k2">;</span>
<span class="number"> 10</span>   vt.font_ascent <span class="k3">=</span> ttf_font_ascent<span class="k2">;</span>
<span class="number"> 11</span>   vt.font_descent <span class="k3">=</span> ttf_font_descent<span class="k2">;</span>
<span class="number"> 12</span>   vt.char_length <span class="k3">=</span> ttf_char_length<span class="k2">;</span>
<span class="number"> 13</span>   vt.text_length <span class="k3">=</span> ttf_text_length<span class="k2">;</span>
<span class="number"> 14</span>   vt.render_char <span class="k3">=</span> ttf_render_char<span class="k2">;</span>
<span class="number"> 15</span>   vt.render <span class="k3">=</span> ttf_render<span class="k2">;</span>
<span class="number"> 16</span>   vt.destroy <span class="k3">=</span> ttf_destroy<span class="k2">;</span>
<span class="number"> 17</span>   vt.get_text_dimensions <span class="k3">=</span> ttf_get_text_dimensions<span class="k2">;</span>
<span class="number"> 18</span>   vt.get_font_ranges <span class="k3">=</span> ttf_get_font_ranges<span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>   <a href="http://www.allegro.cc/manual/al_register_font_loader"><span class="a">al_register_font_loader</span></a><span class="k2">(</span><span class="s">".ttf"</span>, <a href="http://www.allegro.cc/manual/al_load_ttf_font"><span class="a">al_load_ttf_font</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>   <span class="c">/* Can't fail right now - in the future we might dynamically load</span>
<span class="number"> 23</span><span class="c">    * the FreeType DLL here and/or initialize FreeType (which both</span>
<span class="number"> 24</span><span class="c">    * could fail and would cause a false return).</span>
<span class="number"> 25</span><span class="c">    */</span>
<span class="number"> 26</span>   ttf_inited <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 27</span>   <span class="k1">return</span> ttf_inited<span class="k2">;</span>
<span class="number"> 28</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Wed, 24 Jul 2013 12:48:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I suspect race condition or some other synchronization problem somewhere. If I place a unneeded call to al_flip_display before addon initialization, code stop crashing:</p><div class="source-code snippet"><div class="inner"><pre>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>d <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">1024</span>, <span class="n">768</span><span class="k2">)</span><span class="k2">;</span>

  <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/al_init_image_addon"><span class="a">al_init_image_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>b <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span> <span class="s">"../Data/Sprites/defence_arrows.png"</span> 
  <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

However, adding al_rest( 10.0 ) instead of al_flip_display do not help.</p><p>I noticed that when I try to set non-desktop resolution in fullscreen mode, display creation takes a longer time. Maybe this crash has something to do with it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Max Savenkov)</author>
		<pubDate>Thu, 25 Jul 2013 11:02:55 +0000</pubDate>
	</item>
</rss>
