<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[a5] al_create_bitmap() not creating mipmap in OPENGL</title>
		<link>http://www.allegro.cc/forums/view/615645</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 10 Aug 2015 13:05:04 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, so when creating an <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a></span> with <span class="source-code"><a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span>, then drawing some content onto it and then using that bitmap, it exhibits some strange behavior in certain circumstances.  Specifically, if you have set <span class="source-code">al_set_bitmap_flags<span class="k2">(</span>ALLEGRO_MIPMAP<span class="k2">)</span></span> and are in <span class="source-code">ALLEGRO_OPENGL</span>.  I think the odd behavior alludes to the possibility that a mipmap is just not created.</p><p>Here is an example program that illustrated the odd behavior:</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="number">  2</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  5</span><span class="p">#include &lt;allegro5/allegro_color.h&gt;</span>
<span class="number">  6</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  7</span>
<span class="number">  8</span>
<span class="number">  9</span>
<span class="number"> 10</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>create_generated_bitmap<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 11</span><span class="k2">{</span>
<span class="number"> 12</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_STATE"><span class="a">ALLEGRO_STATE</span></a> prev<span class="k2">;</span>
<span class="number"> 13</span>  <a href="http://www.allegro.cc/manual/al_store_state"><span class="a">al_store_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>prev, ALLEGRO_STATE_TARGET_BITMAP<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  <span class="c">// create our bitmap</span>
<span class="number"> 17</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>generated_bitmap <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span><span class="n">512</span>, <span class="n">512</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>  <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>generated_bitmap<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>  <span class="c">// clear the color to "ugly computer teal"</span>
<span class="number"> 21</span>    <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgba_f"><span class="a">al_map_rgba_f</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>.<span class="n">25</span>, <span class="n">0</span>.<span class="n">25</span>, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>  <span class="c">// just draw some lines and junk</span>
<span class="number"> 24</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">20</span><span class="k3">/</span><span class="n">2</span>, <span class="n">20</span><span class="k3">/</span><span class="n">2</span>, <span class="n">960</span><span class="k3">/</span><span class="n">2</span>, <span class="n">724</span><span class="k3">/</span><span class="n">2</span>, <a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span><span class="s">"dodgerblue"</span><span class="k2">)</span>, <span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">20</span><span class="k3">/</span><span class="n">2</span>, <span class="n">700</span><span class="k3">/</span><span class="n">2</span>, <span class="n">660</span><span class="k3">/</span><span class="n">2</span>, <span class="n">234</span><span class="k3">/</span><span class="n">2</span>, <a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span><span class="s">"deeppink"</span><span class="k2">)</span>, <span class="n">30</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">700</span><span class="k3">/</span><span class="n">2</span>, <span class="n">20</span><span class="k3">/</span><span class="n">2</span>, <span class="n">860</span><span class="k3">/</span><span class="n">2</span>, <span class="n">1024</span><span class="k3">/</span><span class="n">2</span>, <a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span><span class="s">"brown"</span><span class="k2">)</span>, <span class="n">40</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">900</span><span class="k3">/</span><span class="n">2</span>, <span class="n">70</span><span class="k3">/</span><span class="n">2</span>, <span class="n">760</span><span class="k3">/</span><span class="n">2</span>, <span class="n">824</span><span class="k3">/</span><span class="n">2</span>, <a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span><span class="s">"orange"</span><span class="k2">)</span>, <span class="n">30</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>
<span class="number"> 29</span>  <span class="c">// put a border on that shit</span>
<span class="number"> 30</span>  <a href="http://www.allegro.cc/manual/al_draw_rectangle"><span class="a">al_draw_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>generated_bitmap<span class="k2">)</span>, <a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>generated_bitmap<span class="k2">)</span>,
<span class="number"> 31</span>    <a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span><span class="s">"red"</span><span class="k2">)</span>, <span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>
<span class="number"> 33</span>
<span class="number"> 34</span>  <span class="c">// restore our previous drawing state</span>
<span class="number"> 35</span>  <a href="http://www.allegro.cc/manual/al_restore_state"><span class="a">al_restore_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>prev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span>  <span class="k1">return</span> generated_bitmap<span class="k2">;</span>
<span class="number"> 38</span><span class="k2">}</span>
<span class="number"> 39</span>
<span class="number"> 40</span>
<span class="number"> 41</span>
<span class="number"> 42</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span><span class="k3">*</span> argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number"> 43</span><span class="k2">{</span>
<span class="number"> 44</span>  <span class="c">// init stuff</span>
<span class="number"> 45</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"> 46</span>  <a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>
<span class="number"> 48</span>
<span class="number"> 49</span>  <span class="c">// set the mode and create the display</span>
<span class="number"> 50</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_OPENGL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 51</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display <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">960</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 52</span>
<span class="number"> 53</span>
<span class="number"> 54</span>  <span class="c">// generate our bitmap</span>
<span class="number"> 55</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_MIPMAP<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bitmap <span class="k3">=</span> create_generated_bitmap<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>
<span class="number"> 58</span>
<span class="number"> 59</span>  <span class="c">// draw at 1.0 scale (normal)</span>
<span class="number"> 60</span>  <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bitmap, <span class="n">20</span>, <span class="n">20</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>  <span class="c">// draw at 0.8 scale</span>
<span class="number"> 62</span>  <a href="http://www.allegro.cc/manual/al_draw_scaled_bitmap"><span class="a">al_draw_scaled_bitmap</span></a><span class="k2">(</span>bitmap, <span class="n">0</span>, <span class="n">0</span>, <span class="n">512</span>, <span class="n">512</span>, <span class="n">300</span>, <span class="n">60</span>, <span class="n">512</span><span class="k3">*</span><span class="n">0</span>.<span class="n">8</span>, <span class="n">512</span><span class="k3">*</span><span class="n">0</span>.<span class="n">8</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 63</span>  <span class="c">// draw at 0.6 scale</span>
<span class="number"> 64</span>  <a href="http://www.allegro.cc/manual/al_draw_scaled_bitmap"><span class="a">al_draw_scaled_bitmap</span></a><span class="k2">(</span>bitmap, <span class="n">0</span>, <span class="n">0</span>, <span class="n">512</span>, <span class="n">512</span>, <span class="n">600</span>, <span class="n">120</span>, <span class="n">512</span><span class="k3">*</span><span class="n">0</span>.<span class="n">6</span>, <span class="n">512</span><span class="k3">*</span><span class="n">0</span>.<span class="n">6</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 65</span>
<span class="number"> 66</span>
<span class="number"> 67</span>  <span class="c">// flip it</span>
<span class="number"> 68</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"> 69</span>
<span class="number"> 70</span>
<span class="number"> 71</span>  <span class="c">// give it some time</span>
<span class="number"> 72</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 73</span><span class="k2">}</span>
</div></div><p>


Running the program should look something like this:<br /><span class="remote-thumbnail"><span class="json">{"name":"609698","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/3\/c3f404614a867f26efcfda574960d499.png","w":995,"h":662,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/3\/c3f404614a867f26efcfda574960d499"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/c/3/c3f404614a867f26efcfda574960d499-240.jpg" alt="609698" width="240" height="159" /></span></p><p>But it looks like this (presumably because when scaling the bitmap, the hardware is trying to crossfade between a smaller mipmap that just isn&#39;t there, so it starts to look transparent)<br /><span class="remote-thumbnail"><span class="json">{"name":"609699","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/0\/809e9e8e9fb8f801ee2d324df854264b.png","w":992,"h":658,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/0\/809e9e8e9fb8f801ee2d324df854264b"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/8/0/809e9e8e9fb8f801ee2d324df854264b-240.jpg" alt="609699" width="240" height="159" /></span></p><p>I can &quot;fix&quot; the issue by cloning the bitmap after drawing everything to it, (and then destroying the original for good measure), like this:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="c">// GENERATED BITMAP in OPENGL with ALLEGRO_MIPMAP fix:</span>
  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>cloned <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_clone_bitmap"><span class="a">al_clone_bitmap</span></a><span class="k2">(</span>generated_bitmap<span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>generated_bitmap<span class="k2">)</span><span class="k2">;</span>
  generated_bitmap <span class="k3">=</span> cloned<span class="k2">;</span>
</pre></div></div><p>

Extra notes:
</p><div class="spoiler"><p>
It may also be related to these 2 threads:<br /><a href="https://www.allegro.cc/forums/thread/615520">https://www.allegro.cc/forums/thread/615520</a><br /><a href="https://www.allegro.cc/forums/thread/613196">https://www.allegro.cc/forums/thread/613196</a></p><p>My hardware is an the Intel card, as Bruce Pascoe mentions in the 2nd thread.  I haven&#39;t tried it on other hardware.
</p></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Mon, 10 Aug 2015 13:05:04 +0000</pubDate>
	</item>
</rss>
