<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Speed of clearing a working area on a bitmap</title>
		<link>http://www.allegro.cc/forums/view/617799</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 05 Apr 2019 00:41:36 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I use &#39;working bitmaps&#39; for quite a lot of my effects - for example, merging overlapping primitives before drawing them with reduced opacity:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>tmp<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span> <span class="n">0</span>,  <span class="n">0</span>, <span class="n">20</span>, <span class="n">20</span>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">1</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span> <span class="n">0</span>, <span class="n">10</span>, <span class="n">20</span>, <span class="n">30</span>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">1</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">10</span>,  <span class="n">0</span>, <span class="n">30</span>, <span class="n">20</span>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>

<a href="http://www.allegro.cc/manual/al_set_target_backbuffer"><span class="a">al_set_target_backbuffer</span></a><span class="k2">(</span>disp<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_draw_tinted_bitmap"><span class="a">al_draw_tinted_bitmap</span></a><span class="k2">(</span>tmp, <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">1</span>,<span class="n">1</span>,<span class="n">1</span>,<span class="n">0</span>.<span class="n">5</span><span class="k2">)</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Here, <span class="source-code">tmp</span> needs to be cleared to 100% transparency before each draw. The most trivial way of doing this would be:</p><div class="source-code snippet"><div class="inner"><pre><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">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Alternatively, I could blank the area needed with a rectangle:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_set_blender"><span class="a">al_set_blender</span></a><span class="k2">(</span>ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ZERO<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">30</span>, <span class="n">30</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">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

So, let&#39;s say I made the (perhaps poor) decision to clear a working area many times in my draw code. Given that <span class="source-code"><a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a></span> ignores blending and transforms, I&#39;m wondering whether it might be better-optimised than the primitives, despite the larger fill area.</p><p>Could someone with knowledge of Allegro&#39;s internals give me a hint as to what might be universally faster?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Mon, 01 Apr 2019 17:10:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Do yourself a favor and get out gdb. Set a breakpoint in al_clear_to_color and al_draw_filled_rectangle and step into the function and see what it does on the OpenGL / DX layer.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 01 Apr 2019 21:04:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I suspect clear is significantly faster given how much is necessary to accomplish the primitive drawing from Allegro&#39;s side.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Tue, 02 Apr 2019 11:14:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I doubt there&#39;s any faster way than just to use glClear.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 03 Apr 2019 08:40:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>&quot;just getting out gdb&quot; would be fine for my specific case, but &#39;universal&#39; is the operative word here; I had no idea whether some internals would run faster/slower on specific backends, OSes, or cards. For whatever reason.</p><p>From what SiegeLord is saying, though, clear sounds like it&#39;s always going to be faster. Ta <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Wed, 03 Apr 2019 16:14:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;d go for <span class="source-code"><a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a></span> - the code looks fairly straightforward:<br /><a href="https://github.com/liballeg/allegro5/blob/d7757184d335d400460808eff8e0d19c9f557673/src/drawing.c#L26-L41">https://github.com/liballeg/allegro5/blob/d7757184d335d400460808eff8e0d19c9f557673/src/drawing.c#L26-L41</a></p><p>Which calls out to this in OpenGL:<br /><a href="https://github.com/liballeg/allegro5/blob/af83c358bbd3b074705151760ebb7b351907cae2/src/opengl/ogl_draw.c#L228-L252">https://github.com/liballeg/allegro5/blob/af83c358bbd3b074705151760ebb7b351907cae2/src/opengl/ogl_draw.c#L228-L252</a></p><p>This in DirectX<br /><a href="https://github.com/liballeg/allegro5/blob/af83c358bbd3b074705151760ebb7b351907cae2/src/win/d3d_disp.cpp#L1980-L1994">https://github.com/liballeg/allegro5/blob/af83c358bbd3b074705151760ebb7b351907cae2/src/win/d3d_disp.cpp#L1980-L1994</a></p><p>And this for memory bitmaps (and also locked OpenGL bitmaps)<br /><a href="https://github.com/liballeg/allegro5/blob/d7757184d335d400460808eff8e0d19c9f557673/src/memdraw.c#L54-L160">https://github.com/liballeg/allegro5/blob/d7757184d335d400460808eff8e0d19c9f557673/src/memdraw.c#L54-L160</a></p><p>You could do the same for <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a></span> <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /></p><p>TBH I doubt either would be disastrously slow...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Thu, 04 Apr 2019 18:29:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nice leg work Peter!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 05 Apr 2019 00:41:36 +0000</pubDate>
	</item>
</rss>
